最小代码:
int t;
static_assert(is_same_v<decltype(1, t), int&>);
上面的代码在g ++和clang ++中编译,但在MSVC中失败。MSVC似乎认为:
int t;
static_assert(is_same_v<decltype(1, t), int>);
该标准指定哪个?对于SFINAE,我相当依赖此模式。
Gcc和Clang是正确的。1, t
是逗号表达式,
逗号表达式的结果的类型,值和值类别恰好是第二个操作数的类型,值和值类别
E2
。
第二个操作数,即t
一个左值,则decltype
结果为T&
。
如果参数是类型的任何其他表达式
T
,则
- 如果表达式的值类别为lvalue,则decltype产生
T&
;
根据标准[expr.comma] / 1:
(强调我的)
结果的类型和值就是右操作数的类型和值;结果与其右操作数具有相同的值类别,
否则,如果
e
是左值,decltype(e)
则是T&
,其中T
的类型e
;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句