【问题标题】:c++ template class, initialization () vs {}c++模板类,初始化() vs {}
【发布时间】:2015-05-12 16:37:23
【问题描述】:

我想知道为什么我不能在另一个类的范围内用 () 而不是 {} 初始化以下模板类的实例 (C++ 11) ?错误:数字常量之前的预期标识符

template <typename T>
class vec3 {

private:

    T   data[3];

public:

    vec3 (T a, T b, T c);
};

template <typename T> 
vec3<T>::vec3 (T a, T b, T c) 
{
    data[0] = a;
    data[1] = b;
    data[2] = c;
}

class whatever {

    vec3 <float> a (1,2,3); // not ok
    vec3 <float> b {1,2,3}; // ok

};

int main () {

    vec3 <float> a (1,2,3); // ok

    return 0;
}

【问题讨论】:

    标签: c++ templates c++11


    【解决方案1】:

    proposal of non-static data member initializers - N2756 中不允许使用 () 的初始化程序,原因由 @T.C.在评论区:

    不幸的是,这使得“( 表达式列表 )”的初始化器 在解析声明时形成歧义:

    struct S {
        int i(x); // data member with initializer
        // ...
        static int x;
    };
    
    struct T {
        int i(x); // member function declaration
        // ...
        typedef int x;
    };
    

    一种可能的解决方案是依赖于现有规则,即如果声明可以是对象或函数,那么它就是函数:

    struct S {
        int i(j); // ill-formed...parsed as a member function,
                  // type j looked up but not found
        // ...
        static int j;
    };
    

    类似的解决方案是应用另一个现有规则,目前仅在模板中使用,如果 T 可以是类型或 别的东西,那就是别的东西;如果我们可以使用“typename” 我们真正的意思是一种类型:

    struct S {
        int i(x); // unabmiguously a data member
        int j(typename y); // unabmiguously a member function
    };
    

    这两种解决方案都引入了许多用户可能会误解的微妙之处(如 comp.lang.c++ 关于为什么“int i();”在块范围内没有声明 默认初始化int)。本文提出的解决方案是只允许“=initializer-clause”和“{initializer-list}”形式的初始化器。

    【讨论】:

      【解决方案2】:

      这只是对如何初始化类成员的限制。您可以使用{}=,但不能使用()

      我认为限制没有特别令人信服的理由;这只是该语言的众多怪癖之一。

      【讨论】:

      • 在类内部使用时不被视为函数减速吗?
      • @NathanOliver:只有()中的东西才能解释为函数参数;在这种情况下,无论它出现在哪里,它都是一个函数声明。
      • 原因是委员会希望 NSDMI 能够像构造函数中的成员初始化器列表一样获得类范围查找,但是允许 () 形式的类范围查找使得很难确定某事是否是解析时的函数声明或初始化程序。
      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 2021-10-21
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多