以下计划是否应该被拒绝? Clang 似乎接受了。
template<typename T>
concept c = requires { T::n; };
struct z;
constexpr bool b(auto...) { return c<z>; }
struct z { int n; };
static_assert(not b()); // clang ok, gcc nope, msvc nope
在评估
b()
时,模板 b
已被隐式删除,然后类型 z
已完成。但是, c<z>
中的表达式 b
不依赖于 b
的任何模板参数。所以,我想问题归结为当定义模板 c<z>
或实例化模板时是否应该解析 b
。
这是根据 [temp.res.general]/6.5 的 IFNDR,因为
c<z>
中没有任何内容是依赖的,但其在专业化中的含义在定义点与实例化点不同。参考文献下面的注释还给出了不完整类型的非依赖使用作为示例。