C ++中的括号和非类型模板参数14

时间:2017-02-15 15:27:30

标签: c++ c++11 gcc clang c++14

以下代码在GCC 6.3中使用-std = c ++ 11编译正常。

template <typename T>
struct MetaFunction
{
    static int value;
};

#define MY_MACRO(T) (MetaFunction<T>::value)

template <class T, const int* p = &MY_MACRO(T)>
struct Foo
{
    void DoSomething()
    {
    }
};

int main()
{
    Foo< int > f;
    f.DoSomething();
}

但如果指定-std = c ++ 14,则会发出以下错误:

main.cpp:19:14: error: '& MetaFunction<int>::value' is not a valid template argument for 'const int*' because it is not the address of a variable
     Foo< int > f;
              ^

Clang 3.8给出了类似的错误,无论是-std = c ++ 11还是-std = c ++ 14都被指定。

main.cpp:11:36: error: non-type template argument does not refer to any declaration
template <class T, const int* p = &MY_MACRO(T)>
                                   ^~~~~~~~~~~

MY_MACRO(T)(MetaFunction<T>::value)更改为MetaFunction<T>::value可解决问题。

哪个编译器在这里是正确的? C ++ 14标准是否包含一个可以预期GCC行为的变化?或者Clang是否也在C ++ 11下发出错误?

0 个答案:

没有答案