сужение броска предупреждений в оценке SFINAE - PullRequest
2 голосов
/ 24 мая 2019

Я получаю 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, но я не нашел способа предотвратить это.

Если не считать этого, мне нужно избавиться от предупреждений вокруг этого кода.

Учитывая ограниченный характер того, какие компиляторы выдают предупреждения, как обходить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...