c++ - clang 和 gcc 之间对三元运算符的 const 引用地址的差异

标签 c++ gcc ternary-operator clang++

我对这里发生的事情有一个模糊的想法...它与 this 有关但我想知道为什么 clang++ 和 g++ 以不同的方式处理这个问题。这里的未定义行为在哪里?注意:这与模板无关——我只是使用它们来使示例更紧凑。这都是关于 whatever 的类型。

#include <iostream>
#include <vector>

template <typename T>
void test()
{
    T whatever = 'c';


    const char a = 'a';

    std::cout << "begin: " << (void*)&a << std::endl;

    const char & me = (true ? a : whatever);

    std::cout << "ref:   " << (void*)&me << std::endl;
}

int main(int argc, char**argv)
{

    test<const char>();
    test<char>();

    return 0;
}

gcc 输出(测试到 4.9.3):

begin: 0x7fffe504201f
ref:   0x7fffe504201f
begin: 0x7fffe504201e
ref:   0x7fffe504201f

clang 3.7.0 输出:

begin: 0x7ffed7b6bb97
ref:   0x7ffed7b6bb97
begin: 0x7ffed7b6bb97
ref:   0x7ffed7b6bb97

最佳答案

我的回答来自this other question from today详细介绍您的案例。我将避免重复自己,只做总结。

如果我们分解出模板,您有两种情况。案例一:

const char whatever = 'c';
const char a = 'a';
const char & me = (true ? a : whatever);

条件运算符的第二个和第三个操作数都是“const char 类型的左值”,因此结果是“const char 类型的左值”,指定选择的操作数。最后,const char & 直接绑定(bind)到“const char 类型的左值”,所以 &me == &a

对于情况 2:

char whatever = 'c';
const char a = 'a';
const char & me = (true ? a : whatever);

第二个和第三个操作数是“char 类型的左值”和“const char 类型的左值”。其结果是“const char 类型的左值”,指定了选定的操作数。和以前一样,const char &me 直接绑定(bind)到 const char 类型的左值,所以 &me == &a

如果编译器为 mea 打印出不同的地址,这就是编译器错误。

关于c++ - clang 和 gcc 之间对三元运算符的 const 引用地址的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40160904/

相关文章:

python - 简单的 pybind11 模块失败,没有命名模块

c++ - Clang、LLVM 和 g++

c++ - G++ 将 float 视为非法指令

java - 如何将两个 If 语句写入一行(三元运算符)?

C++ 解引用数组

c++ - Fd 大于 1024 时 Select 和 FD_SET 的行为

c++ - 多维数组动态分配内存图

c - gcc 中如何实现可变参数?

javascript - 三元语句不起作用

ruby - 有没有办法让这个 Ruby 三元运算正确评估?