今天我们发现了一个令人困惑的 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 中的错误还是我们只是误解了标准?