【发布时间】:2022-01-01 10:49:23
【问题描述】:
可以通过两种方式访问静态类成员函数或变量:通过对象(obj.member_fun() 或obj.member_var)或通过类(Class::member_fun() 或Class::member_var)。但是,在constexpr 函数中,Clang 给出了对象访问错误并要求使用类访问:
struct S
{
constexpr static auto s_v = 42;
constexpr static auto v() { return s_v; }
};
#define TEST 1
constexpr auto foo(S const& s [[maybe_unused]])
{
#if TEST
constexpr auto v = s.v(); // ERROR for clang, OK for gcc
#else
constexpr auto v = S::v(); // OK for clang and gcc
#endif
return v;
}
constexpr auto bar(S const& s [[maybe_unused]])
{
#if TEST
constexpr auto v = s.s_v; // ERROR for clang, OK for gcc
#else
constexpr auto v = S::s_v; // OK for clang and gcc
#endif
return v;
}
int main() {}
Live Example 使用 -std=c++1z 和 #define TEST 1 为 Clang 5.0 SVN 编译,并带有错误消息:
Start prog.cc:12:24: error: constexpr variable 'v' must be initialized by a constant expression constexpr auto v = s.v(); // ERROR for clang, OK for gcc ^~~~~ prog.cc:22:24: error: constexpr variable 'v' must be initialized by a constant expression constexpr auto v = s.s_v; // ERROR for clang, OK for gcc ^~~~~ 2 errors generated. 1 Finish
问题:这是一个 Clang 错误,还是 gcc 在接受 constexpr 函数中静态成员访问的两种语法形式时过于宽松?
【问题讨论】:
-
gcc 编译出来的代码是否工作
-
@VIPER 是的(虽然这是一个简化的例子)
-
在实践中,即使允许,你也不应该这样做......
-
好像和this question类似。
-
foo和bar是constexpr函数无关紧要。见example。
标签: c++ language-lawyer c++17 constexpr static-members