功能或实例声明?

时间:2013-06-26 21:44:07

标签: c++ c++11

考虑下一个代码

struct X
{
    X(float) {}
};

int const x = 3;

X f(float(x));

标准C ++编译器是否应将最后一行解析为类型为X (*)(float)的函数声明,或者通过调用XX::X(float(3))的实例解析为?

1 个答案:

答案 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, "!");
}