考虑下一个代码
struct X
{
X(float) {}
};
int const x = 3;
X f(float(x));
标准C ++编译器是否应将最后一行解析为类型为X (*)(float)
的函数声明,或者通过调用X
将X::X(float(3))
的实例解析为?
答案 0 :(得分:8)
这是一个函数声明。 C ++ 11标准的第8.2 / 1段解释了这一点:
由函数式演员与6.8中提到的声明之间的相似性引起的歧义 也可以在声明的上下文中出现。在这种情况下,选择是在函数声明之间 带有参数名称周围的冗余括号和带有函数样式的对象声明 作为初始化者。正如6.8中提到的含糊不清一样,决议是考虑任何结构 这可能是声明宣言。
标准也提供了一个例子:
struct S {
S(int);
};
void foo(double a) {
S w(int(a)); // function declaration <=== Your example
S x(int()); // function declaration
S y((int)a); // object declaration
S z = int(a); // object declaration
}
您的示例中的声明声明了一个函数,它接受float
并返回X
,如以下程序中的(非触发)静态断言所证明的那样(live example) :
#include <type_traits>
struct X
{
X(float) {}
};
int const x = 3;
X f(float(x));
int main()
{
static_assert(std::is_same<decltype(f), X(float)>::value, "!");
}