与问题相关如何检查C++ 11支持?而什么是__cplusplus对C++ 17的价值?
如何查询编译器是否可以处理/设置为使用C++ 20?我知道原则上可以通过以下方式查询C++版本:
#if __cplusplus > ???
// C++20 code here
#endif
Run Code Online (Sandbox Code Playgroud)
什么应该???是C++ 20?
考虑以下代码片段:
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编译器版本错误?
考虑以下代码片段:
#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)
上面的代码使用各种编译器进行编译。相反,以下代码段不会编译。唯一的区别是Func(Argvs 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) 假设一个 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)
这样的事情可能吗?