Мой вопрос: почему следующий код генерирует предупреждение только для constexpr
функций, но не для шаблонов?
Я понимаю, что означают предупреждения и как от них избавиться.Я не понимаю, почему компилятор не выдает предупреждения для constexpr
членов 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;
}
$ g++ -Wconversion -std=c++11 a.cc
a.cc: In instantiation of ‘constexpr double ToDouble(T) [with T = long int]’:
a.cc:22:45: required from here
a.cc:12:10: warning: conversion to ‘double’ from ‘long int’ may alter its value [-Wconversion]
return value;
^~~~~
a.cc: In instantiation of ‘constexpr T ToSquare(T) [with T = char]’:
a.cc:25:45: required from here
a.cc:17:16: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
return value * value;