类型转换时,Visual Studio不会创建临时对象?

我正在使用Visual Studio Express 2013,并试图在C ++中学习不同的东西。

我偶然发现了编译器中一个有趣的bug,它在明确地将类型转换为与引用类型相同的类型时似乎不会创建临时对象。

#include <iostream>

using namespace std;

int main()
{
    int number; // float number;
    number = 2;

    const int& plainref_i = number;
    const int& recastref_i = (int)number; // this goes wrong if number is int
    const float& plainref_f = number;
    const float& recastref_f = (float)number; // this goes wrong if number is float

    number = 3;

    std::cout << plainref_i << "n";
    std::cout << recastref_i << "n";
    std::cout << plainref_f << "n";
    std::cout << recastref_f << "n";

    return 0;
}

这将在VS编译时产生以下输出:3 3 2 2

但是用gcc编译,会产生以下输出:3 2 2 2

如果我替换“int数字”; 与“浮点数”; 我进VS:2 2 3 3

和gcc:2 2 3 2

我想知道是否有人可以证实这是一个错误,如果有人知道可行的解决方案/解决方案。


鉴于:

 int number;

这个演员的结果应该是一个价值:

const int& recastref_i = (int)number; // this goes wrong if number is int

并且由于使用的是常量引用那么它可以结合到prvalue其值应从任何变化脱离number但Visual Studio有产生一个左值代替prvalue的延伸,所以你实际上接收左值参考number ,其意味着在检查recastref_i的值时,将反映值到number任何更改。

Visual Studio团队建议使用/Zc:rvalueCast标志来关闭此行为(重点是我的):

当指定/ Zc:rvalueCast选项时,编译器会根据C ++ 11标准正确识别作为转换操作结果的右值引用类型。 如果未指定该选项,则编译器行为与Visual Studio 2012中的相同。默认情况下,/ Zc:rvalueCast处于关闭状态。 为了达到一致性并消除使用强制转换中的错误,我们建议您使用/ Zc:rvalueCast。

而不是/Za ,这将禁用所有可能在实际情况下出现问题的扩展。

从草案的C ++标准第5.4节显式类型转换(转换符号)第1段说(强调我的):

表达式(T)转换表达式的结果是T类型的。如果T是左值引用类型或右值引用,则结果是左值,如果T是对对象类型的左值引用,则为x值; 否则的结果是一个prvalue。

链接地址: http://www.djcxy.com/p/24979.html

上一篇: Visual Studio is not creating temporary object when typecasting?

下一篇: Android NFC read ISO15693 RFID Tag