有没有办法解决以下问题:
此代码生成 C4702 警告“无法访问的代码”(在带有 /std:c++17
的 VC++ 15.8 上)
template <typename T, typename VariantType>
inline bool MatchMonostate( VariantType& variant )
{
SUPPRESS_C4100( variant );
if constexpr ( std::is_same_v<T, std::monostate> )
{
variant = std::monostate();
return true;
}
return false; // !!! unreachable if the above is true !!! => C4702
}
为了抑制 C4100 的“未引用形式参数”警告,我已经在使用技巧了
#define SUPPRESS_C4100(x) ((void)x)
添加的简单思路
else
{
return false;
}
导致警告 C4715“并非所有控制路径都返回值”。
最佳答案
它是不可访问的,因为对于基于模板参数的模板的给定扩展,该函数将仅通过条件并返回 true 或 失败并返回 false。对于同一类型,不可能有任何一种情况。它本质上是扩展到
if (true) {
return true;
}
return false; // Obviously will never happen
我会将其重写为只有一个返回语句。
template <typename T, typename VariantType>
inline bool MatchMonostate( VariantType& variant )
{
SUPPRESS_C4100( variant );
bool retval = false;
if constexpr ( std::is_same_v<T, std::monostate> )
{
variant = std::monostate();
retval = true;
}
return retval;
}
此外,在条件为真的情况下,变体不会未被使用。您可能希望将抑制警告(基本上变成 (void)variant)的那行移动到 else 语句。
关于c++ - if constexpr 和 C4702(以及 C4100 和 C4715),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244640/