考虑以下代码示例,我本以为在这里需要使用
Clang的错误信息:
MSVC的错误信息:
template
关键字来指导编译器将变量v
视为模板。然而,MSVC拒绝使用template
关键字,而Clang和GCC实际上要求使用它。C++20标准中的哪个具体规则要求或禁止在这种情况下使用template
关键字?struct s {
template<typename...>
static constexpr auto v = true;
};
// all ok
static_assert([](auto x){ return decltype(x)::template v<>; }(s{}));
// clang ok, gcc ok, msvc nope
static_assert([](auto x){ return x.template v<>; }(s{}));
// clang nope, gcc nope, msvc ok
static_assert([](auto x){ return x.v<>; }(s{}));
Clang的错误信息:
<source>:10:36: error: use 'template' keyword to treat 'v'
as a dependent template name
10 | static_assert([](auto x){ return x.v<>; }(s{}));
| ^
| template
MSVC的错误信息:
<source>(8): error C2187: syntax error: 'template' was unexpected here
<source>(8): note: see reference to function template instantiation
'auto <lambda_2>::operator ()<s>(_T1) const' being compiled
with
[
_T1=s
]
(auto x)
替换为(s x)
,然后它们都能正常工作。 所以编译器在推断auto
时遇到了问题。 - undefinedauto
使得 lambda 函数成为模板化的。即使它们被调用时使用了s
,它们的函数体必须对任何类型都有效;编译器不能假设x
是一个s
(除非是对于非可观察的情况,根据 as-if 规则)。 - undefined.template v<>
是正确的形式:p->X<0>::f(); // error: A::X not found in ((p->X) < 0) > ::f()
。 我正在尝试理解为什么[basic.lookup.qual.general]/3
是答案。 - undefined