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
的构造函数的调用。
让我们的程序形成为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
的构造函数的调用。