有没有办法解决以下问题:
此代码生成C4702警告"无法访问代码"(在VC++ 15.8上/std:c++17)
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
}
Run Code Online (Sandbox Code Playgroud)
为了抑制C4100'未引用的形式参数'警告,我已经在使用这个技巧了
#define SUPPRESS_C4100(x) ((void)x)
Run Code Online (Sandbox Code Playgroud)
添加的简单想法
else
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
导致警告C4715'并非所有控制路径都返回值'.
我正在用 C++ 编写一个仅包含头文件的库。使事情尽可能简单,用户只需#include mylib.h
在某些情况下,(高级)用户可能想要配置库的行为(例如错误处理、编译时或运行时检查、调试输出以及可能的其他内容)
请不要告诉我执行此操作的最佳方法(甚至标准方法),因为否则问题将被搁置!
现在,我有一个文件“config.h”作为我的库的一部分,其中包含相关内容,#define MYLIB_XYZs但我意识到这完全是无稽之谈,因为用户需要修改库本身才能进行配置。
我已经实现了一个constexpr编译时哈希函数,如果被调用,它可以正常工作(即在编译时进行评估)
constexpr auto hash = CompileTimeHash( "aha" );
Run Code Online (Sandbox Code Playgroud)
但是我需要在实际代码中使用它作为函数的参数
foo( CompileTimeHash( "aha" ) ); // foo is NOT constexpr
Run Code Online (Sandbox Code Playgroud)
由于某个特定原因,我不能使用长版本
constexpr auto hash = CompileTimeHash( "aha" );
foo( hash );
Run Code Online (Sandbox Code Playgroud)
编译器(VC++)在短(第一)情况下不会编译时哈希.有没有办法实现这个目标?
编辑:现在可以找到一个覆盖3个案例的例子:https: //godbolt.org/z/JGAyuE 只有gcc在所有3个案例中完成它
c++ ×3
c++17 ×2
compile-time ×1
config ×1
constexpr ×1
header-files ×1
if-constexpr ×1
lib ×1
visual-c++ ×1