Tag: 语言律师

vector分配是否使`reserve`无效?

假设我写了 std::vector<T> littleVector(1); std::vector<T> bigVector; bigVector.reserve(100); bigVector = littleVector; 标准是否说bigVector仍然有100个元素保留? 或者,如果我要push_back 99个元素,我会经历内存重新分配吗? 也许它在STL实现之间甚至有所不同。 这是以前在这里讨论的,但没有给出标准参考。

灵活的数组成员可能导致未定义的行为?

通过在结构types中使用灵活数组成员(FAM),我们是否将我们的程序暴露给未定义行为的可能性? 一个程序是否可以使用FAM,而且仍然是一个严格符合的程序? 灵活数组成员的偏移量是否需要在结构的末尾? 这些问题适用于C99 (TC3)和C11 (TC1) 。 #include <stdio.h> #include <stdlib.h> #include <stddef.h> int main(void) { struct s { size_t len; char pad; int array[]; }; struct s *s = malloc(sizeof *s + sizeof *s->array); printf("sizeof *s: %zu\n", sizeof *s); printf("offsetof(struct s, array): %zu\n", offsetof(struct s, array)); s->array[0] = 0; s->len = 1; printf("%d\n", s->array[0]); […]

为什么构造函数语法不能与“unsigned int”types一起使用?

为什么在C ++中以下是非法的? auto x = unsigned int(0); 以下是一切正常: auto y = int(0); auto z = unsigned(0); auto w = float(0); 或一般: auto t = Type(… c-tor-args …); (除了Type是unsigned int )。

将负浮点值转换为unsigned int的行为是什么?

如果将负浮点值转换为无符号整型的值,会发生什么情况? 标准报价将不胜感激。 我面临的问题是从变体类转换为无符号整型types的值,其中包含浮点types的对象。 例: unsigned i = -.1;

工会作为基础class

该标准定义联盟不能作为基类使用,但有没有具体的推理呢? 据我了解,联盟可以有构造函数,析构函数,成员variables和方法来操作这些varibales。 总之,一个联盟可以封装一个数据types和状态,可以通过成员函数来访问。 因此,在大多数情况下,它可以作为一个类来使用,如果它可以作为一个类,那么为什么它不能作为一个基类呢? 编辑:虽然答案试图解释的推理,我仍然不明白联盟作为一个派生类是最糟糕的时候,联盟只是一个类。 所以希望得到更具体的答案和推理,我会推这个奖金。 已经发布的答案没有冒犯,感谢那些!

C ++ 11标准是否要求通过一个常量unordered_container访问元素的两次迭代以相同的顺序访问元素?

for (auto&& i : unordered_container) { /* … */ } for (auto&& i : unordered_container) { /* .. */ } 标准是否要求这两个循环访问相同顺序的元素(假定容器是未修改的)? 我对这个问题的分析 我读的标准和最好的我可以告诉答案是“不” 因为容器的迭代器是向前的,所以有一种语言要求a==b暗示++a==++b用于前向迭代器。 这意味着两个迭代将通过相同的path,如果他们都在同一个地方开始。 这将问题简化为标准是否需要container.begin() == container.begin() 。 我找不到任何需要的语言。

C编译和执行程序有什么区别?

如果一个expression式的评估在C中导致了未定义的行为,并且该expression式总是在程序执行时被评估(例如,如果它出现在main的开头),那么它是否符合,如果一个实现在编译时拒绝它? 在编译/翻译一个程序和执行它之间,C有区别吗? 我知道有C的口译员。他们如何处理C标准有关这种差异? 示例(读取未初始化的本地) int main() { int i; return i; } 当运行它时,在执行的任何阶段(甚至在调用main之前),程序都可以做一些有趣的事情。 但是当我们甚至没有试图运行它时,也会发生一些有趣的事情吗? 它可以导致编译器本身的缓冲区溢出?

为什么shared_ptr删除者必须是CopyConstructible?

在C ++ 11中std::shared_ptr有四个构造函数,可以传递typesD deleter对象d 。 这些构造函数的签名如下: template<class Y, class D> shared_ptr(Y * p, D d); template<class Y, class D, class A> shared_ptr(Y * p, D d, A a); template <class D> shared_ptr(nullptr_t p, D d); template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 该标准要求在[util.smartptr.shared.const]typesD是CopyConstructible。 为什么这需要? 如果shared_ptr复制了d那么这些删除者中的哪一个可能被调用? shared_ptr只能保持一个删除器吗? 如果d可以被复制,那么对于shared_ptr 拥有一个删除器意味着什么? CopyConstructible需求的基本原理是什么? PS:这个要求可能会使shared_ptr写删除变得复杂。 unique_ptr似乎对删除器有更好的要求。

像int(x)这样的声明的目的是什么? 或者int(x)= 10;

如果你*declarator*s in §8/4查看*declarator*s in §8/4语法,你会发现noptr-declarator可以写成( ptr-declarator ),也就是说,它可以写成( declarator-id ),validation标题中的声明。 事实上,这个代码编译没有问题: #include <iostream> struct A{ int i;}; int (x) = 100; A (a) = {2}; int main() { std::cout << x << '\n'; std::cout << ai << '\n'; } 但是,当指针(到数组或函数)不在声明中时,允许这些括号的目的是什么 ?

条件运算符的返回types和两阶段查找

考虑下面的代码片段: struct Base { }; struct Derived : Base { }; void f(Base &) { std::cout << "f(Base&)\n"; } template <class T = int> void g() { Derived d; f(T{} ? d : d); // 1 } void f(Derived &) { std::cout << "f(Derived&)\n"; } int main() { g(); } 在这种情况下,我认为应该在第一阶段调用f的函数,因为它的参数types是不可信的Derived& ,因此被parsing为f(Base&) ,它是唯一的范围。 铿锵3.8.0与我同意 ,但GCC […]