考虑下一个代码
struct X
{
X(float) {}
};
int const x = 3;
X f(float(x));
标准 C++ 编译器应该将最后一行解析为带有类型的函数声明X (*)(float)
还是X
通过调用创建一个实例X::X(float(3))
?
那是一个函数声明。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
}
您的示例中的声明声明了一个接受 afloat
并返回a 的函数,正如以下程序(现场示例X
)中的(非触发)静态断言所证明的那样:
#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, "!");
}