C++ 临时 class 模棱两可地实例化

C++ temporary class instantiation ambiguously

让我们的程序形成为class。只有构造函数调用会产生一些副作用。调用后无需在内存中处理 class 个实例。以下代码实例化 class:

struct A{
    A(int){}
    };
int main() {

    A(0);//right. Pass const to ctor
    int x=0;
    A(x);//bad. Compiler interpret like A x;
    (A(x));//right. New temporary object passed to brackets
    A((int)x);//right. Pass temporary int to ctor

    return 0;
}

(另见 Online IDE

为什么是A(x);解释为变量 x 声明而不是临时 A 对象实例化?

那是因为你认为应该是ctor的参数列表,(x)被解释为“括号中的x”。因此,A(x) 读作 A (x) 读作 A x

在其他情况下,编译器提示它应该生成一个 A 实例,使用提供的参数调用 ctor。

来自 C++11 标准,ISO/EIC 14882 §6.8 [stmt.ambig] ¶1(强调我的):

There is an ambiguity in the grammar involving expression-statements and declarations: An expression-statement with a function-style explicit type conversion (5.2.3) as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration.

要将此应用于您的问题,A(x); 可以解析为 "call the function A / construct a temporary object of type A, and pass x as the only function/constructor argument" 或 "declare a variable x of type A." 标准规定在这种情况下,它应该被解析为变量声明。

您的其他示例没有歧义,因为它们不能被解析为变量声明,因此它们被解析为对 A 的构造函数的调用。