关于开关标准说明如下."当执行switch语句时,将评估其条件并与每个case常量进行比较."
这是否意味着条件表达式只评估一次和一次,并且每个编译器的标准都保证了它?
例如,当在switch语句头中使用函数时,会产生副作用.
int f() { ... }
switch (f())
{
case ...;
case ...;
}
Run Code Online (Sandbox Code Playgroud) 我对 C++ 中的简单反射机制有问题。我想要一种模板类型,它应该以不同的成员函数指针作为模板参数表现不同:
[解决方案#1,按照标准是不好的]
如果我有一个带有类类型及其成员函数指针的类模板,我不能部分地专门化为空的成员指针,因为我不能专门化“具有依赖类型的非类型模板参数”(请参阅:https://en。 cppreference.com/w/cpp/language/partial_specialization参数列表 [5])
template<class O, void(O::*foo)() = nullptr>
struct p
{};
template<class O, void(O::*foo)()>
struct p<O, nullptr>
{};
Run Code Online (Sandbox Code Playgroud)
[解决方案#2,GCC 问题]
如果我尝试专门研究一个推导的 constexpr 值,该值反映到成员指针,编译器会遇到不同的问题。GCC8.2 x64 告诉我nullptr == foo表达式在上下文中不是常量:p<A, &A::f> j;. 但是ARM GCC8说没关系。我认为这是一些内存布局问题,struct A在模板引擎尝试评估具体函数指针时不完整。
template<class O, void(O::*foo)() = nullptr, bool = nullptr == foo>
struct p
{};
template<class O, void(O::*foo)()>
struct p<O, foo, true>
{};
struct A
{
void f();
p<A, &A::f> j;
};
Run Code Online (Sandbox Code Playgroud)
[解决方案#2 用法,MSVC 问题]
奇怪的是,MSVC 19.5 x86 …