decltype(1,t)应该是左值引用吗?(编译器不同意)

Narut Sereewattanawoot

最小代码:

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,我相当依赖此模式。

songyuanyao

Gcc和Clang是正确的。1, t逗号表达式

逗号表达式的结果的类型,值和值类别恰好是第二个操作数的类型,值和值类别E2

第二个操作数,即t一个左值,则decltype结果为T&

如果参数是类型的任何其他表达式T,则

  • 如果表达式的值类别为lvalue,则decltype产生T&;

根据标准[expr.comma] / 1

(强调我的)

结果的类型和值就是右操作数的类型和值;结果与其右操作数具有相同的值类别

[dcl.type.decltype] /1.5

否则,如果e是左值,decltype(e)则是T&,其中T的类型e

顺便说一句:我在这里尝试使用MSVC 并在Gcc和Clang中获得了相同的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

模板模板和CRTP:编译器错误以及GCC和clang不同意

编译器不同意接受这个 view::keys 代码

如何简洁地让编译器知道一个值应该是什么类型并检查它?

当编译器错误地认为类型应该是所有字符串时,如何对具有不同类型的记录列表进行排序?

我用于Retrofit接口创建的通用函数得到编译器错误:推断的类型为Class <T>?但是应该是Class <T!>

phpseclib对$ this-> bitmask的引用应该是$ this-> bitmap吗?

对于不同的类,serialVersionUID应该是唯一的吗?

装饰器类在Java中应该是抽象的吗?

控制器应该是不可变的吗?

域模型映射器应该是静态的吗?

ViewController的包装器应该是ViewController吗?

这应该是constexpr吗?

应该是简单的XPATH吗?

片段应该是独立的吗?

ClassLoader应该是线程安全的吗?

这应该是同步方法吗?

这应该是班级成员吗?

类的成员应该是指针吗?

哨兵的数量应该是奇数吗?

js断言应该是错误的吗?

交叉编译时,CMake的link.txt中的链接器命令应该是什么?

[expr.unary.op] / 9似乎暗示不能将运算符!()应用于以下类型A。但是编译器不同意这一点

jQuery datepicker和php datetime不同意吗?

JSX 值应该是表达式或引用的 JSX 文本 (8:19)

终端和文件管理器不同意

Grunt Uglify产生浏览器不同意的代码

每个奇特的指针都应该是一个迭代器吗?

第二个参数应该是Kaiser滤波器吗?

尝试将std :: vector <std :: pair <T,U >>强制转换为其左值引用时,出现VS编译器警告C4239