请考虑以下代码:
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(带有相同的标志)接受该程序。
哪种编译器正确?为什么?