language-lawyer相关内容
C 中 main 函数的有效签名到底是什么?我知道: int main(int argc, char *argv[]) 还有其他有效的吗? 解决方案 C11 标准明确提到了这两个: int main(void);int main(int argc, char* argv[]); 虽然它确实提到了短语“或等效物"带有以下脚注: 因此,int 可以替换为定义为 int 的 typ
..
C++ 标准在 3.3.2“声明点"中包含一个半著名的“令人惊讶"名称查找示例: int x = x; 这用自身初始化 x,它(作为原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量). 这实际上是未定义的行为吗? 根据4.1“左值到右值转换",对未初始化的值执行左值到右值转换是未定义的行为.右手边的 x 是否进行了这种转换?如果是这样,该示例实际上是否会有未定义的行为?
..
已更新,见下文! 我听说并读到 C++0x 允许编译器为以下代码段打印“Hello" #include int main() {同时(1);std::cout
..
大家好,我今天偶然发现了这段代码,我对究竟发生了什么以及更具体的顺序感到困惑: 代码: #include bool foo(double & m){米 = 1.0;返回真;}int main(){双重测试 = 0.0;std::cout
..
我已经看到它多次断言 C++ 标准不允许以下代码: int 数组[5];int *array_begin = &array[0];int *array_end = &array[5]; &array[5] 在这种情况下是合法的 C++ 代码吗? 如果可能,我想要一个参考标准的答案. 了解它是否符合 C 标准也很有趣.如果它不是标准的 C++,为什么决定将它与 array + 5 或
..
在堆栈溢出问题重新定义 C++11 中不允许的 lambda,为什么?,一个给出了无法编译的小程序: int main() {自动测试 = []{};测试 = []{};} 问题得到了回答,一切看起来都很好.然后是 Johannes Schaub 并制作了 一个有趣的观察: 如果你在第一个 lambda 之前放一个 +,它会神奇地开始工作. 所以我很好奇:为什么下面的方法有效?
..
“未定义行为"的经典伪造示例当然是“鼻魔"— 无论 C 和 C++ 标准允许什么,这在物理上都是不可能的. 因为 C 和 C++ 社区倾向于如此强调未定义行为的不可预测性,以及允许编译器在遇到未定义行为时使程序按字面意思做任何事情的想法,我曾假设标准对未定义的行为没有任何限制. 但是 C++ 标准中的相关引用似乎是 一个>: [C++14: defns.undefined]:
..
如初始化是否需要左值右值转换?是 int x = x; UB 吗? C++ 标准在 3.3.2 声明点 部分有一个令人惊讶的例子,其中int 用它自己的不确定值初始化: int x = 12;{ int x = x;} 这里第二个 x 用它自己的(不确定的)值初始化.— 结束示例 ] Johannes 对这个问题的回答表明是未定义的行为,因为它需要左值到右值的转换. 在最新的 C+
..
考虑以下代码: #include 结构体{//(一种):void bar() { std::cout
..
auto const 和 const auto 之间是否存在语义差异,或者它们的意思相同? 解决方案 const 限定符适用于紧邻左边的类型,除非左边没有任何东西,否则它适用于左边的类型立即正确.所以是的,它是一样的.
..
看看这个片段: int a;外部国际b;汽车 b = a; 它是否格式良好?Clang 成功编译了它,但 GCC 和 MSVC 没有. (当我回答如何声明和定义具有推导类型的静态成员?) 解决方案 Tl;DR; clang 是正确的,逻辑是 [dcl.spec.auto] 允许这样做,并限制推导出的返回类型 [dcl.spec.auto]p11 已添加,否则没有限制,因此这
..
考虑以下程序: extern int x;自动 x = 42;int main() { } Clang 3.5 接受(现场演示),GCC 4.9 和 VS2013 不接受(前者的现场演示).谁是对的,C++ 标准中规定的正确行为在哪里? 解决方案 令人惊讶的是,标准中几乎没有这方面的内容.我们听到的关于重新申报的所有信息是: [C++11: 3.1/1]: 声明(第 7 条)可以
..
我对以下代码中的操作顺序有疑问: std::atomicX;std::atomicy;国际r1;国际r2;无效线程1(){y.exchange(1, std::memory_order_acq_rel);r1 = x.load(std::memory_order_relaxed);}无效线程2(){x.exchange(1, std::memory_order_acq_rel);r2 = y.l
..
简而言之 我想为两个类之间的协变关联建模,每个类都可以专门化.我需要展示相关关联类的专业化.但我想避免我的模型可能意味着存在冗余关联(即泛化之间的关联和特化之间的关联. 问题的逐步说明 我在 UML 类图中有一个 Person 和一个 Contract 之间的多对多关联.一个人可以涉及多个合同,反之,一个合同可以涉及多个人.每个相关人员都参与了合同中的角色.一个人甚至可以多次参与
..
为什么是未定义的行为? struct s{const int id;//
..
具体是下面的代码,标记下面的那一行行吗? struct S{一个;};#include int main(){结构 S * p;p = malloc(sizeof(struct S) + 1000);//这一行:*(&(p->a) + 1) = 0;} 人们在此处争论不休,但没有人给出令人信服的解释或参考. 他们的论点略有不同,但基本相同 typedef struct _pack{in
..
考虑以下 returnsNull 函数和对它的泛型调用: public static 列表returnNull(Class clazz) {返回空;}公共静态无效主(字符串[] args){列表>l = returnNull(AtomicReference.class);} Eclipse 编译器在设置为 Java 8 时接受它,但 Java 8 中的 j
..
我在操作一些字节码时遇到了一个问题,其中某个 final String 常量没有被 java 编译器 (Java 8) 内联,请参见下面的示例: 公共类MyTest{private static final String ENABLED = "Y";私有静态最终字符串禁用=“N";私有静态布尔值是启用的(字符串键){返回 key.equals("A");}私有静态字符串getString(字符串
..
在C语言中,如果像这样初始化一个数组: int a[5] = {1,2}; 那么所有未显式初始化的数组元素将被隐式初始化为零. 但是,如果我像这样初始化一个数组: int a[5]={a[2]=1};printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]); 输出: 1 0 1 0 0 我不明白,为什么 a[0] 打印 1 而
..
这可以在 C 中得到保证,因为 WG14/N1570 中有以下语句: 6.2.5/20 ... 数组类型描述了具有特定成员对象类型(称为元素类型)的连续分配的非空对象集. 但是在WG21/N4527中,即在C++中,对应的语句变成了 8.3.4/1 ...数组类型的对象包含连续分配的 N 个 T 类型子对象的非空集合. 而将“describes"改为“contains",则
..