C ++ Wconversion предупреждение в функциях constexp, но не в шаблонах - PullRequest
0 голосов
/ 29 сентября 2018

Мой вопрос: почему следующий код генерирует предупреждение только для 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;

1 Ответ

0 голосов
/ 29 сентября 2018

Шаблон генерирует тип.В каждом экземпляре типа значение value является постоянной времени компиляции.И он может проверять потерю точности.

В случае constexpr, функции, сгенерированные функцией шаблона, не имеют этого свойства.Аргумент value не обязательно является константой времени компиляции.Хотя вы используете его только в контексте, где он является постоянной времени компиляции, предупреждение не проверяет каждый вызывающий контекст.

Возможно, вы неправильно поняли constexpr;в функциях говорится, что функция может быть оценена во время компиляции, но не должна быть .

...