小编use*_*653的帖子

如何检查C++ 20支持?__cplusplus对C++ 20的价值是多少?

与问题相关如何检查C++ 11支持?什么是__cplusplus对C++ 17的价值?

如何查询编译器是否可以处理/设置为使用C++ 20?我知道原则上可以通过以下方式查询C++版本:

#if __cplusplus > ???
  // C++20 code here
#endif
Run Code Online (Sandbox Code Playgroud)

什么应该???是C++ 20?

c++ macros c++20

29
推荐指数
3
解决办法
3580
查看次数

使用可变参数模板的功能模板重载:英特尔c ++编译器版本18产生的结果与其他编译器不同。英特尔错了吗?

考虑以下代码片段:

template<typename T, template<typename, typename ...> class A, typename ... Ts>
int a(A<T, Ts...> arg){
  return 1; // Overload #1
}

template<typename A>
int a(A arg) {
  return 2;  // Overload #2
}

template<typename T>
struct S{};

int main() {
  return a(S<int>());
}
Run Code Online (Sandbox Code Playgroud)

a使用模板类的实例调用函数时,我希望编译器选择更特殊的函数重载#1。根据编译器资源管理器的说法,直到版本17的clang,gcc和intel确实选择了#1重载。相反,后来的intel编译器版本(18和19)选择#2重载。

代码定义不正确吗?还是最新的intel编译器版本错误?

c++ templates language-lawyer variadic-templates

10
推荐指数
1
解决办法
141
查看次数

具有std :: function的ADL:是否可以通过std :: function的参数列表中的类型找到采用std :: function对象的函数?

考虑以下代码片段:

#include <functional>

namespace ns {
    struct Arg{};
    using Func = std::function<int(Arg)>;

    Func operator+(Func lhs, Func rhs) {
        return [lhs, rhs](Arg arg) {
            return lhs(arg) + rhs(arg);
        };
    }
}

int main() {
    ns::Func foo = [](ns::Arg i) {return 5;};
    ns::Func bar = [](ns::Arg i) {return 2;};
    auto foobar = foo + bar;
    return foobar(ns::Arg());
}
Run Code Online (Sandbox Code Playgroud)

上面的代码使用各种编译器进行编译。相反,以下代码段不会编译。唯一的区别是FuncArgvs int)内部使用的参数类型:

#include <functional>

namespace ns {
    using Func = std::function<int(int)>;

    Func operator+(Func lhs, Func rhs) {
        return [lhs, …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer argument-dependent-lookup std-function

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

如何确保枚举枚举类中定义的每个案例,例如使用static_assert?

假设一个 enum class

enum class MY_ENUM {FOO, BAR};
Run Code Online (Sandbox Code Playgroud)

和一个std::map包含枚举中每个元素的信息

map<MY_ENUM, MyInfoType> enumInfos;
Run Code Online (Sandbox Code Playgroud)

如何在编译时确保枚举的每个值在地图中都有一个条目?

我希望能够写出类似的东西(当然这段代码无效):

for (auto& elem : MY_ENUM) {
    static_assert(enumInfos.find(elem) != enumInfos.end(),
        "Error: Information for an element in MY_ENUM is missing.")
}
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

c++ enums c++11

2
推荐指数
1
解决办法
1023
查看次数