启用 c++17 时 __cplusplus 的奇怪输出
Strange output of __cplusplus when enabled c++17
我在这里用元编程做一些实验,最初的想法是找出我们是否可以在编译时使排序的整数序列唯一。 (虽然这与问题无关)
我在我的属性中启用了 c++17(我使用 VS2019),当我想找出 C++ 标准时,这个程序给了我奇怪的输出。
#include <iostream>
#include <boost/mp11.hpp>
#include <type_traits>
namespace
{
template <int... N>
using seq = boost::mp11::mp_list_c<int, N...>;
template <int... N>
struct uniq
{
using type = boost::mp11::mp_unique<seq<N...>>;
};
}
int main()
{
static_assert(std::is_same_v<uniq<1, 2, 2, 2, 3, 3, 3>::type, seq<1, 2, 3>>,"Assertion Failed");
static_assert(std::is_same_v<uniq<4, 1, 9, 9, 2, 2, 3, 1, 5>::type, seq<4, 1, 9, 2, 3, 5>>,"Assertion Failed");
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
return 0;
}
这会打印“C++98”,我想知道这是怎么回事?我已经从属性中启用了 c++17,而且我显然使用了一些比 c++98 更高级的语言特性(比如可变参数模板)。
这是否提醒任何人我会错过什么?
在 Visual Studio 中,您必须启用 /Zc:__cplusplus
才能获得适当的值。
这与向后兼容性有关。
我在这里用元编程做一些实验,最初的想法是找出我们是否可以在编译时使排序的整数序列唯一。 (虽然这与问题无关)
我在我的属性中启用了 c++17(我使用 VS2019),当我想找出 C++ 标准时,这个程序给了我奇怪的输出。
#include <iostream>
#include <boost/mp11.hpp>
#include <type_traits>
namespace
{
template <int... N>
using seq = boost::mp11::mp_list_c<int, N...>;
template <int... N>
struct uniq
{
using type = boost::mp11::mp_unique<seq<N...>>;
};
}
int main()
{
static_assert(std::is_same_v<uniq<1, 2, 2, 2, 3, 3, 3>::type, seq<1, 2, 3>>,"Assertion Failed");
static_assert(std::is_same_v<uniq<4, 1, 9, 9, 2, 2, 3, 1, 5>::type, seq<4, 1, 9, 2, 3, 5>>,"Assertion Failed");
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
return 0;
}
这会打印“C++98”,我想知道这是怎么回事?我已经从属性中启用了 c++17,而且我显然使用了一些比 c++98 更高级的语言特性(比如可变参数模板)。
这是否提醒任何人我会错过什么?
在 Visual Studio 中,您必须启用 /Zc:__cplusplus
才能获得适当的值。
这与向后兼容性有关。