SFINAE评估中的缩小范围警告

时间:2019-05-24 16:07:23

标签: c++ c++11 sfinae

当在gcc上使用此代码时(特别是gcc <5.0或gcc 7上启用了c ++ 17),我收到了SFINAE上下文产生的警告警告。 Clang和MSVC不会在此代码上产生那些警告。

// 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;
};

这用于检查我们是否可以从另一个类型构造一个类型,然后从新构造的值移入该类型。

如果需要的话,我可以禁用此代码周围的警告,但我想了解我是否可以在代码中做一些其他事情,这些事情最初不会产生。

大括号初始化是在与其他条件一起使用的上下文中进行的,但是即使未选择使用大括号初始化的重载,也似乎会产生警告。

在某些情况下会使用错误,这会导致编译失败,否则似乎会像我期望的那样编译和执行,只是带有一些警告。

说一个类有一个构造函数

class classX
{
classX(char){}
...
}

然后

is_direct_constructible<classX,int>::value

会评估为true,但会在gcc上产生警告。

理想情况下,缩小转换范围会导致SFINAE失败,但我还没有找到防止这种情况的任何方法。

我需要消除此代码周围的警告。

鉴于编译器生成警告的性质有限,因此有什么方法可以解决这些警告。

0 个答案:

没有答案