在模板中返回一个没有返回类型声明的值,这是一个错字吗?

时间:2015-09-03 02:30:34

标签: c++ c++11 template-meta-programming

我正在观看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?这是一个错字吗?

2 个答案:

答案 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限定的。

第二个不是法律声明。