无法显式调用默认构造函数

Can't call default constructor explicitly

本文关键字:默认 构造函数 调用      更新时间:2023-10-16

可能的重复项:
使用空括号集调用默认构造函数时出错

为什么下面的代码编译没有问题,但是当我切换行时

MCl<char, a> tryout;

MCl<char, a> tryout();

我收到"错误 C2228:".ea"的左侧必须有类/结构/联合"?tryout() 不是对默认构造函数的调用吗?

这是完整的代码

template <class T, T myval> class MCl
{
public:
    T ea;
    MCl() : ea(myval)
    {
    }
};
int main()
{

    const char a = 'e';
    MCl<char, a> tryout;
    // MCl<char, a> tryout();
    cout << tryout.ea;
    return 0;
}
MCl<char, a> tryout();

声明函数试用,它不接收任何内容并返回MCl<char, a>

N3337 8.2/1

选择函数声明参数名称周围有一组多余的括号,以及具有函数样式的对象声明强制转换为初始值设定项。正如6.8中提到的歧义一样,决议是考虑任何结构这可能是一个宣言,一个宣言。[ 注意:声明可以通过以下方式显式消除歧义非函数样式强制转换,通过 = 表示初始化或删除多余的括号参数名称。—尾注 ]

MCl<char, a> tryout();

这既是函数原型,要么是通过 void 构造函数实例化,这是模棱两可的。这种歧义被掩盖为"最令人烦恼的解析"——甚至在 C++03 标准本身中也进行了讨论!

但是,人们往往不会提到 C++11 引入了一种新的语法,通过统一初始化来消除歧义。在此新语法下,MCl的实例化将表示如下:

MCl<char, a> tryout{};

声明一个变量;

MCl<char, a> tryout;    // uses default constructor if user defined one.
                        // If compiler generated constructor uses value-initialized
                        // of members which for POD types means uninitialized.

是函数的前向声明(称为试用):

MCl<char, a> tryout();

你想要的可能是:(对于C++03 C++11,见Mike Kwan)。

MCl<char, a> tryout  = MCl<char, a>(); // uses default constructor if user defined one.
                        // If compiler generated constructor uses zero-initialized
                        // of members which for POD types means 0 is placed in them.