我正在观看Walter E. Brown的演讲Modern Template Metaprogramming。在54:40,代码如下所示
template<class T, T v>
struct integral_constant{
static constexpr T value = v;
constexpr operator T() const noexcept { return value; } // what does this mean?
constexpr T operator T() const noexcept { return value; }
};
我的问题是这条线是什么意思
constexpr operator T() const noexcept { return value; }
,为什么没有返回类型,但它仍在返回value
?这是一个错字吗?
答案 0 :(得分:9)
是的,第二个操作员行错误,可以完全删除。
类型操作符,例如。执行operator int()
当对象被转换或隐式转换为类型时:
MyClass myObject;
int i = myObject; // here operator int() is used.
当然,operator int()
必须返回int
。没有必要或允许为这些运算符编写特定的返回类型。在您的情况下,它不是int
float
或任何特定的,而是模板类型,但它是相同的想法。
除了返回类型问题,第二个操作符行再次定义具有相同参数的相同操作符,不能有多个具有相同名称和参数的函数。
在整个struct
之后,缺少分号。
解决这些问题后,它会编译:http://ideone.com/Hvrex5
答案 1 :(得分:3)
第一个不是拼写错误。该语法用于提供从类对象到另一种类型的转换。
返回类型为T
有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/cast_operator。
consexpr
限定符向编译器指示成员函数的返回值可以在编译时确定,如果调用它的对象也是constexpr
限定的。
第二个不是法律声明。