当在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失败,但我还没有找到防止这种情况的任何方法。
我需要消除此代码周围的警告。
鉴于编译器生成警告的性质有限,因此有什么方法可以解决这些警告。