x-x*_*x-x 4 c++ gcc explicit-conversion c++11 visual-studio-2013
以下示例包含两个模板化类,用于表示度和弧度,并使用显式转换运算符在它们之间进行转换.它使用g ++(ideone链接)编译和运行,但不使用Visual Studio 2013 Visual C++ Compiler Nov 2013 CTP (CTP_Nov2013)作为平台工具集.
#include <iostream>
static const double PI = 3.14159265358979323846;
// Forward declarations
template< typename T > class radians;
template< typename T > class degrees;
template< typename T >
class degrees
{
public:
degrees(const T value)
: value_(value)
{}
template< typename U >
explicit operator U() const
{
return value_ * PI / 180.0;
}
T value() const { return value_; }
private:
T value_;
};
template< typename T >
class radians
{
public:
radians(const T value)
: value_(value)
{}
template< typename U >
explicit operator U() const
{
return (value_* 180.0) / PI;
}
T value() const { return value_; }
private:
T value_;
};
template< typename T >
std::ostream& operator<<(std::ostream& out, const radians<T>& r)
{
return out << r.value() << "r";
}
template< typename T >
std::ostream& operator<<(std::ostream& out, const degrees<T>& r)
{
return out << r.value() << "d";
}
int main()
{
using degs = degrees<float>;
using rads = radians<float>;
auto d = degs{10};
auto r = static_cast<rads>(d);
std::cout << d << std::endl;
std::cout << r << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio错误输出:
error C2440: 'static_cast' : cannot convert from 'degrees<float>' to 'rads' degrad.cpp 69 1 degrad
error C3536: 'r': cannot be used before it is initialized degrad.cpp 72 1 degrad
Run Code Online (Sandbox Code Playgroud)
怎么了?为什么它适用于g ++但不适用于Visual Studio 2013?哪个编译器正在做正确的事情?
不接受所述代码片段的编译器有问题,提供的代码是合法的,在编译期间不应产生致命的诊断.换一种说法; msvc做错了.
标准的相关部分
12.3.2 转换功能
[class.conv.fct]2函数可以是
explicit(7.1.2),在这种情况下,它仅被视为用户定义的直接初始化转换(8.5).否则,用户定义的转换不限于在分配和初始化中使用.
8.5 初始化器
[dcl.init]16表单中发生的初始化
T x(a);
T x {a};在
new表达式(5.3.4)中,static_cast表达式(5.2.9),函数表示法类型转换(5.2.3)以及基本和成员初始化器(12.6.2)称为直接初始化.
我如何处理MSVC++故障?
使用typedef radians<float> rads;代替using,或者;
explicit从转换功能中删除,或;
使用auto r = rads { d }或初始化变量auto r = rads (d);.
| 归档时间: |
|
| 查看次数: |
711 次 |
| 最近记录: |