4

今天我们发现了一个令人困惑的 C++11 别名声明行为。这是示例:

template<typename T>
struct Q
{
    typedef T t;
};

template<typename T>
void foo(Q<T> q)
{
    using q_t = Q<T>; 
    //typedef Q<T> q_t; // if we uncomment this and comment 'using' the example compiles
    typename q_t::t qwe; // <<<<<<<<<< Error: no type named ‘t’ in ‘using q_t = struct Q<T>’
}

int main(int argc, char *argv[])
{
    Q<int> q;
    foo(q);
    return 0;
}

ISO 14882 (C++11) 说这两个声明必须具有相同的语义(第 145 页)。

但是,如果我们使用 'using' 声明了 q_t,则该示例不会使用 GCC 4.7.2 (Debian Wheezy) 和 GCC 4.7.3 (Ubuntu 13.04) 进行编译,但是将 'using' 语句替换为 'typedef' 语句会使其编译。

它是 GCC 中的错误还是我们只是误解了标准?

4

2 回答 2

4

这似乎是一个 GCC 4.7 错误。

这是我编译代码的测试,它使用 gcc 4.8.1

所以正如规范所说:

using q_t = Q<T>;
// is equivalent to this 
typedef Q<T> q_t;
于 2013-09-06T12:42:56.437 回答
1

使用 --std=c++11 使用 g++ 4.8.1 编译对我来说很好

于 2013-09-06T12:49:36.190 回答