我的问题是,为什么以下代码仅对constexpr
函数而不对模板生成警告?
我确实了解警告的含义以及如何消除警告。我不明白的是,为什么编译器不向下面constexpr
的{{1}}成员ToDouble
和ToSquare
的成员发出警告?
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;
}
答案 0 :(得分:3)
模板生成一个类型。在每种类型的实例中,值value
是一个编译时间常数。并且它可以检查精度损失。
在constexpr
情况下,模板函数的生成函数不具有此属性。不保证参数value
是编译时间常数。虽然您仅在它是编译时间常数的上下文中使用它,但警告并不会检查每个调用上下文。
可能您误解了constexpr
;在函数上,它指出可以对函数 进行编译时间评估,而不是必须 。