constexp函数中的C ++ Wconversion警告,但模板中却没有

时间:2018-09-29 11:26:09

标签: c++ templates constexpr

我的问题是,为什么以下代码仅对constexpr函数而不对模板生成警告?

我确实了解警告的含义以及如何消除警告。我不明白的是,为什么编译器不向下面constexpr的{​​{1}}成员ToDoubleToSquare的成员发出警告?

struct Test
#include <iostream>

template <typename T, T value>
struct Test {
  static constexpr double ToDouble = value;

  static constexpr T ToSquare = value * value;
};

template <typename T>
constexpr double ToDouble(T value) {
  return value;
}

template <typename T>
constexpr T ToSquare(T value) {
  return value * value;
}

int main() {
  std::cout << Test<long, 1>::ToDouble << std::endl;
  std::cout << ToDouble(static_cast<long>(1)) << std::endl;

  std::cout << Test<char, 1>::ToSquare << std::endl;
  std::cout << ToSquare(static_cast<char>(1)) << std::endl; 
}

1 个答案:

答案 0 :(得分:3)

模板生成一个类型。在每种类型的实例中,值value是一个编译时间常数。并且它可以检查精度损失。

constexpr情况下,模板函数的生成函数不具有此属性。不保证参数value是编译时间常数。虽然您仅在它是编译时间常数的上下文中使用它,但警告并不会检查每个调用上下文。

可能您误解了constexpr;在函数上,它指出可以对函数 进行编译时间评估,而不是必须