小编mik*_*ikk的帖子

C++ switch语句表达式评估保证

关于开关标准说明如下."当执行switch语句时,将评估其条件并与每个case常量进行比较."

这是否意味着条件表达式只评估一次和一次,并且每个编译器的标准都保证了它?

例如,当在switch语句头中使用函数时,会产生副作用.

int f() { ... }
switch (f())
{
    case ...;
    case ...;
}
Run Code Online (Sandbox Code Playgroud)

c++ standards language-lawyer

55
推荐指数
2
解决办法
2925
查看次数

Constexpr 关于成员函数指针值 - 未定义的行为?

我对 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 …

c++ templates c++11 c++14

6
推荐指数
1
解决办法
227
查看次数

标签 统计

c++ ×2

c++11 ×1

c++14 ×1

language-lawyer ×1

standards ×1

templates ×1