具有类别别名阴影的不一致的编译器行为

时间:2015-11-06 18:32:03

标签: c++ gcc clang

请考虑以下代码:

namespace detail {
  template<typename S>
  struct expr {
    using type = int;
  };

  template<>
  struct expr<void> {
    using type = double;
  };
}

template<typename S>
using expr = typename detail::expr<S>::type;

template<typename S>
struct s {
    expr<S> expr;
};

当我使用GCC 5.2.0编译它时,我收到以下错误:

$ g++ -std=c++14 -W{all,extra,error} -pedantic main.cpp
main.cpp:18:11: error: declaration of 'expr<S> expr_stmt<S>::expr' [-fpermissive]
   expr<S> expr;
           ^
main.cpp:14:44: error: changes meaning of 'expr' from 'using expr = typename detail::expr<S>::type' [-fpermissive]
 using expr = typename detail::expr<S>::type;
                                            ^

然而,clang 3.7.0(带有相同的标志)接受该程序。

哪种编译器正确?为什么?

0 个答案:

没有答案