static_cast和显式转换运算符

时间:2013-11-19 16:37:40

标签: c++ gcc c++11 clang

我发现以下代码在gcc 4.7.3上给出了编译错误,但在clang 3.3上没有:

#include <cstdint>                                          

struct X {
    explicit operator uint32_t() { return 0; }
};

int main() {
    static_cast< int >( X() );
    return 0;
}

问题是,哪个是对的? Gcc 4.7.3说:

testcast.cpp:8:29: error: invalid static_cast from type 'X' to type 'int'

我认为发生的是clang使用uint32_t运算符来获取无符号,然后隐式地将其转换为int。我怀疑规范并没有留下这个未定义的内容,因此我希望其中一个编译器出错。

1 个答案:

答案 0 :(得分:3)

您必须明确地将其强制转换为uint32_t,否则会出现编译错误。你应该试试这个:

static_cast< uint32_t >( X() );

所以,如果它没有在clang-3.3中出错,那它似乎是一个bug。

观察:GCCClang-3.4都拒绝代码并导致编译错误。