![]() |
1
5
是的,MSVC错了。
代码格式良好似乎有悖常理,因为
那为什么允许呢?首先,非正式地考虑一下,一个表达式不是一个常量表达式,如果它的计算结果是一个本身不是常量表达式的glvalue,或者是一个在封闭表达式之外开始使用的变量( [expr.const]p2.7 ).
其次,
现在,发生的是
我们有:
所有这些都不会违反
[expr.const]p2
,因此得到的表达式实际上是一个常量表达式,用作
这些类型的表达式称为 converted constant expressions
|
![]() |
2
1
MSVC在这里是不正确的,让我们从代码的简化版本开始:
移动到
我们在这里也很好。在最初的示例中,我们引用了一个模板非类型参数,该参数在常量表达式中可用,因此同样的推理也适用于该情况。的两个操作数
我们也可以看到 MSVC still treats the simplified case as ill-formed 即使叮当声和海湾合作委员会接受它。 |
![]() |
3
-1
如果您声明:
演示 here .
对你来说
所以我认为所有的编译器都是对的。
1
|
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
![]() |
ridiculous_fish · std::是否保证短路? 2 年前 |
![]() |
Fabio · 在c中将指针赋给常数指针++ 2 年前 |
![]() |
johnco3 · 初始化固定C数组成员结构 6 年前 |
![]() |
mans · 为什么出现此错误:constexpr在此处无效 6 年前 |
![]() |
juztcode · 在C++中尝试捕获-创建了多少个对象 6 年前 |
![]() |
Steven Scott · 忽略元素的基于范围的for循环 6 年前 |