clang和gcc

时间:2016-10-20 17:33:40

标签: 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

1 个答案:

答案 0 :(得分:0)

this other question from today的答案详细介绍了您的案例。我会避免重复自己,只是总结一下。

如果我们将模板分解出来,则有两种情况。案例1:

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

条件运算符的第二个和第三个操作数都是“const char类型的左值”,因此结果是“类型const char的左值”指定所选的操作数。最后,const char &直接绑定到“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直接绑定到const char类型的左值,所以&me == &a

如果编译器在任何一种情况下都为mea打印不同的地址,那么它就是编译错误。