Tag: 语言律师

比较悬挂指针是合法的吗?

比较悬挂指针是合法的吗? int *p, *q; { int a; p = &a; } { int b; q = &b; } std::cout << (p == q) << '\n'; 注意p和q如何指向已经消失的对象。 这是合法的吗?

在理论上,C ++实现是否可以并行处理两个函数参数的评估?

给定以下函数调用: f(g(), h()) 因为函数参数的求值顺序是未指定的(就我所知,仍然是C ++ 11中的情况),理论上可以并行执行g()和h()吗? 这种平行化只能在g和h被认为是相当平凡的(在最明显的情况下,只访问他们身体本地的数据),以避免引入并发问题,但除此之外,我看不到什么禁止它。 那么,标准允许吗? 即使只通过as-if规则? (在这个答案中 ,曼卡塞尔否认了这一点 ,但是他没有引用这个标准,而且我对[expr.call]也没有显示出任何明显的措词。

静态成员函数中`this`的types?

在C ++ 5.1.1 / 3 [expr.prim.general]中说: types和值类别[在this ]在静态成员函数中定义。 这是什么意思? 它是如何相关的? 注意: this不应该出现在静态成员函数的声明中

在C ++中的逗号运算符的不同行为与返回?

这(注意逗号运算符 ): #include <iostream> int main() { int x; x = 2, 3; std::cout << x << "\n"; return 0; } 输出2 。 但是,如果您使用逗号运算符return ,则: #include <iostream> int f() { return 2, 3; } int main() { int x; x = f(); std::cout << x << "\n"; return 0; } 输出3 。 为什么逗号运算符的行为与return有所不同?

什么时候额外的括号会影响运算符的优先级?

C ++中的括号用在许多地方:例如在函数调用和分组expression式中覆盖运算符优先级。 除了非法的额外括号 (比如函数调用参数列表)之外,C ++的一个通用但不是绝对的规则就是额外的括号不会受到伤害 : 5.1主expression式[expr.prim] 5.1.1一般[expr.prim.general] 6加括号的expression式是一个主expression式,其types和值与所附expression式的types和值相同。 括号的存在不影响expression式是否左值。 带括号的expression式可以用在与包含的expression式可以使用的expression式完全相同的上下文中, 除非另有说明,否则使用相同的含义。 问题 :除了覆盖基本的运算符优先级之外,在哪些上下文中,额外的括号会改变C ++程序的含义? 注 :我认为指针到成员语法限制为不带圆括号的&qualified-id超出范围,因为它限制了语法,而不是允许两个含义不同的语法。 同样, 在预处理器macros定义中使用括号也可以防止不需要的运算符优先级。

为什么019不是JavaScript语法错误? 或者为什么是019> 020

如果我在JavaScript控制台中input019 > 020 (在Chrome和Firefox中都testing过),我的答案是true 。 这是由于020被解释为OctalIntegerLiteral (等于16 ),而019显然被解释为DecimalLiteral (和等于19 )。 当19大于16 , 019 > 020为true 。 令我感到困惑的是为什么019被解释为DecimalLiteral 。 是哪个生产? DecimalIntegerLiteral不允许019 : DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits_opt OctalIntegerLiteral也不允许019 (因为9不是八进制数字): OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 所以从我在规范中看到的019实际上应该被拒绝,我不明白为什么它被解释为一个十进制整数。 我想这里有一些兼容性规则,但是我没有find一个正式的定义。 可以请任何人帮助我呢? (为什么我需要这个:我正在用JavaCC为Java开发一个JavaScript / ECMAScriptparsing器,并且必须特别注意规范及其偏差。)

不同的编译器调用不同的演员操作符

考虑下面这个简短的C ++程序: #include <iostream> class B { public: operator bool() const { return false; } }; class B2 : public B { public: operator int() { return 5; } }; int main() { B2 b; std::cout << std::boolalpha << (bool)b << std::endl; } 如果我在不同的编译器上编译它,我会得到不同的结果。 使用Clang 3.4和GCC 4.4.7它打印true ,而Visual Studio 2013打印false ,这意味着他们在(bool)b调用不同的演员操作。 根据标准哪个是正确的行为? 在我的理解operator bool()不需要转换,而operator int()需要一个int来bool转换,所以编译器应该select第一个。 […]

什么时候是一个私人的构造不是一个私人的构造函数?

比方说,我有一个types,我想使其默认构造函数私有。 我写了以下内容: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // error: as above } […]

使用非静态数据成员和嵌套类构造函数的类内初始化时出错

下面的代码是相当微不足道的,我希望它应该编译好。 struct A { struct B { int i = 0; }; B b; A(const B& _b = B()) : b(_b) {} }; 我用g ++版本4.7.2,4.8.1,clang ++ 3.2和3.3testing了这个代码。 除了这个代码( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770 )上的g ++ 4.7.2段错误之外,其他testing编译器给出的错误信息并不能解释太多。 g ++ 4.8.1: test.cpp: In constructor 'constexpr A::B::B()': test.cpp:3:12: error: constructor required before non-static data member for 'A::B::i' has been parsed struct B […]

这是一个已知的C ++ 11循环的陷阱?

让我们想象一下,我们有一个结构体,可以用一些成员函数来保存3个双打: struct Vector { double x, y, z; // … Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // … }; 这简单一点,但我相信你也同意类似的代码在那里。 这些方法可以让您方便地链接,例如: Vector v = …; v.normalize().negate(); 甚至: […]