is_aggregate_initializable 的实现不适用于 MinGW64
implementation of is_aggregate_initializable does not work with MinGW64
我需要使用一个 traits 函数来推断一个类型是否可以从给定参数聚合初始化。通常它类似于 std::is_constructible
,但在 decltype()
.
中使用聚合初始化
template<typename POD, typename Tuple, typename = void_t<>>
struct is_aggregate_initializable_from_tuple : std::false_type
{
};
template<typename POD, typename ... Types>
struct is_aggregate_initializable_from_tuple<POD, std::tuple<Types...>, void_t<decltype(POD{Types()...})>>
: std::true_type
{
};
template<typename T, typename ... From>
struct is_aggregate_initializable : is_aggregate_initializable_from_tuple<T, std::tuple<From...>>
{
};
这适用于 MSVC 和 C++11,但不能用 MinGW64 编译。
但是它确实使用 C++14 使用 MinGW64 进行编译。
#include <string>
struct abc
{
int a = 4;
float b = 8.15f;
char c = 'c',
d = 'd';
int e = 16;
double f = 23.42;
std::string g = "oceanic";
};
int main()
{
static_assert(detail::is_aggregate_initializable<abc>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char, int>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char, int, double>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char, int, double, std::string>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, abc>(), "Unexpected");
return 0;
}
这是一个错误吗?我做错了什么?
我注意到甚至 abc a{int()};
也不能用 MinGW64 C++11 编译。没看懂...
我想通了。
从 C++11 到 C++14,聚合需要 no default member initializers。
这就是我无法初始化 abc
的原因。如果它没有默认成员,它将编译。
我需要使用一个 traits 函数来推断一个类型是否可以从给定参数聚合初始化。通常它类似于 std::is_constructible
,但在 decltype()
.
template<typename POD, typename Tuple, typename = void_t<>>
struct is_aggregate_initializable_from_tuple : std::false_type
{
};
template<typename POD, typename ... Types>
struct is_aggregate_initializable_from_tuple<POD, std::tuple<Types...>, void_t<decltype(POD{Types()...})>>
: std::true_type
{
};
template<typename T, typename ... From>
struct is_aggregate_initializable : is_aggregate_initializable_from_tuple<T, std::tuple<From...>>
{
};
这适用于 MSVC 和 C++11,但不能用 MinGW64 编译。 但是它确实使用 C++14 使用 MinGW64 进行编译。
#include <string>
struct abc
{
int a = 4;
float b = 8.15f;
char c = 'c',
d = 'd';
int e = 16;
double f = 23.42;
std::string g = "oceanic";
};
int main()
{
static_assert(detail::is_aggregate_initializable<abc>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char, int>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char, int, double>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, int, float, char, char, int, double, std::string>(), "Unexpected");
static_assert(detail::is_aggregate_initializable<abc, abc>(), "Unexpected");
return 0;
}
这是一个错误吗?我做错了什么?
我注意到甚至 abc a{int()};
也不能用 MinGW64 C++11 编译。没看懂...
我想通了。
从 C++11 到 C++14,聚合需要 no default member initializers。
这就是我无法初始化 abc
的原因。如果它没有默认成员,它将编译。