尝试使用braced-init-list调用模板基类构造函数时出现问题

时间:2016-06-18 12:22:05

标签: c++11

如果我混淆了我的术语,那么c ++的新生就这样原谅我。正在阅读Stroustrup,他非常坚持使用braced-init-list语法来构建和初始化我试图在我的研究中应用的对象。然而,当我使用模板探索继承时,我遇到了一些奇怪的行为,到目前为止我还无法在线找到答案。以下是几个例子:

非模板示例:

class A {
    int x;
public:
    A(int x = 0) : x{ x } {}; // works as expected.
};

class B : public A {
    int y;
public:
    B(int x = 1, int y = 1) : A(x), y{ y } {}; // old syntax works obviously.
};

模板示例无法使用以下错误进行编译:

template<typename T>
class A {
    T x;
public:
    A(T x = 0) : x{ x } {}; // works as expected.
};

template<typename T>
class B : public A<T> {
    T y;
public:
    // Compilation fails on the following line (vs2015).
    // Compiler has an issue with A<T>{ X }. Replacing {} with ()
    // works as expected. Shouldn't it work with {} as well?
    // B(T x = 1, T y = 1) : A<T>( x ), y{ y } {};  
    B(T x = 1, T y = 1) : A<T>{ x }, y{ y } {};  
};

错误:

Error   C2059   syntax error: ','
Error   C2334   unexpected token(s) preceding '{'; skipping apparent function body

现在让我感到困惑的是以下原因:

template<typename T>
class C : public A<T> {
    using A_alias = A<T>;
    T z;
public:
    // Why does this workaround work while the expected syntax fails
    // to compile?
    C(T x = 2, T z = 2) : A_alias{ x }, z{ z } {};
};

任何人都可以对这里发生的事情有所了解,我一整天都在翻阅这本书,但是我找不到任何参考资料,因为我不是,所以搜索一直没有结果确切地知道要搜索什么。

1 个答案:

答案 0 :(得分:1)

这看起来像编译器错误。 gcc--std=c++14级别编译有问题的代码而没有任何问题。