std::is_same 编译器之间的不同结果

Nir*_*Nir 58 c++ boolean rvalue lvalue value-categories

#include <iostream>

int main() {
    bool b = true;
    std::cout << std::is_same<decltype(!(!b)), bool>::value << "\n";

    auto bb = (!(!b));
    std::cout << std::is_same<decltype(bb), bool>::value << "\n";
}
Run Code Online (Sandbox Code Playgroud)

上面的代码使用不同的编译器有不同的结果。这是编译器错误还是我遗漏了什么?

use*_*570 50

这是一个海湾合作委员会错误。问题在于 gcc 错误地将表达式视为!(!b)左值而不是右值。您可以在这里确认这一点。正如您将在上面链接的演示中看到的,gcc 给出的输出是lvalue而不是prvalue.

该错误已报告为:

GCC 将右值视为左值

  • 不仅 `value_category` 对它进行了错误分类,`!(!b) = false;` 实际上编译(在调试版本 https://godbolt.org/z/Wxx3ds84f 中)到设置 `b= 的 `mov` 存储0`,否则优化掉)。所以这很有趣。这不仅仅是分类输出中的错误。其他编译器当然正确地拒绝了这一点。@PabloH:任何偶数个“!”都会编译,任何奇数都会被拒绝,因为不是左值,所以是的,您对早期消除的猜测与该实验兼容。 (10认同)
  • 也许它是在很早的阶段进行的优化,消除了!!作为“多余”。 (8认同)