静态成员函数在声明之前在模板类中是否可见?

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

静态成员函数

b
对于
s
的默认构造函数的requires子句是否应该可见? C++20 标准对所提供示例的合法性有何规定?

template<auto...>
struct s {
    s() requires (s::b()) = default; // clang nope, gcc ok, msvc ok
    static constexpr bool b()
    { return true; }
};
static_assert((s<>{}, true));

实例


来自 Clang 的错误消息:

<source>:3:22: error: no member named 'b' in 's<...>'
    3 |     s() requires (s::b()) = default;
      |                   ~~~^
<source>:7:15: error: static assertion expression is not an integral constant
expression
    7 | static_assert((s<>{}, true));
      |               ^~~~~~~~~~~~~
<source>:7:16: note: non-constexpr constructor 's' cannot be used in a constant
expression
    7 | static_assert((s<>{}, true));
      |                ^
<source>:3:5: note: declared here
    3 |     s() requires (s::b()) = default;
      |     ^
c++ language-lawyer c++20 static-members requires-clause
1个回答
-1
投票

问题在于

s::b()
在被认为是不完整类型的上下文中使用类
c
,并且查找不完整类型的成员显然是不允许的。

如果

C
的定义是
可从
P
到达或者如果C位于
P
完整类上下文
中,则P在程序点
C
处完成。 否则,
C
P
处不完整。

- [class.mem.general] p8

静态成员函数的 require 子句不是这样的上下文,并且

s::b()
格式不正确。

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