类型何时完成?

问题描述 投票:0回答:1

以下计划是否应该被拒绝? 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

演示

c++ language-lawyer c++20
1个回答
0
投票

这是根据 [temp.res.general]/6.5 的 IFNDR,因为

c<z>
中没有任何内容是依赖的,但其在专业化中的含义在定义点与实例化点不同。参考文献下面的注释还给出了不完整类型的非依赖使用作为示例。

© www.soinside.com 2019 - 2024. All rights reserved.