Я получаю Wnarrowing предупреждения, генерируемые из контекста SFINAE, когда этот код используется на gcc (в частности, gcc <5.0 или если c ++ 17 включен на gcc 7). Clang и MSVC не выдают эти предупреждения в этом коде. </p>
// check for constructibility from a specific type and copy assignable used in the parse detection
template <typename T, typename C> class is_direct_constructible {
template <typename TT, typename CC>
static auto test(int) -> decltype(TT{std::declval<CC>()}, std::is_move_assignable<TT>());
template <typename, typename> static auto test(...) -> std::false_type;
public:
static const bool value = decltype(test<T, C>(0))::value;
};
Это используется для проверки, можем ли мы создать тип из другого типа, а затем перейти к нему из вновь созданного значения.
Я могу отключить предупреждения вокруг этого кода, если это необходимо, но я хотел бы понять, есть ли что-то, что я могу сделать по-другому в коде, который не будет производить их в первую очередь.
Инициализация фигурной скобки - это то, что выполняется в контексте, который используется вместе с другими условиями, но предупреждения, похоже, выдаются, даже если перегрузка, использующая инициализацию фигурной скобки, не выбрана.
Werror используется в некоторых контекстах, что приводит к сбою компиляции, в противном случае он, похоже, компилируется и выполняется, как я и ожидал, только с кучей предупреждений.
Скажем, у класса есть конструктор
class classX
{
classX(char){}
...
}
затем
is_direct_constructible<classX,int>::value
будет оцениваться как true, но выдаст предупреждение на gcc.
В идеале сужение конверсий приведет к сбою SFINAE, но я не нашел способа предотвратить это.
Если не считать этого, мне нужно избавиться от предупреждений вокруг этого кода.
Учитывая ограниченный характер того, какие компиляторы выдают предупреждения, как обходить их.