【问题标题】:implementation of is_aggregate_initializable does not work with MinGW64is_aggregate_initializable 的实现不适用于 MinGW64
【发布时间】:2020-12-03 22:41:26
【问题描述】:

我需要使用一个特征函数来推断一个类型是否可以从给定的参数聚合初始化。通常它类似于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 进行编译。没看懂……

【问题讨论】:

  • 你得到什么编译器错误?此外,语法T{args...} 不仅适用于聚合。统一初始化允许{} 也可以调用构造函数。
  • @NathanOliver 除了断言失败之外,我没有任何收获。
  • 哪个断言失败?
  • @NathanOliver 除了&lt;abc&gt;&lt;abc, abc&gt;之外的所有人

标签: c++ c++11 templates sfinae mingw-w64


【解决方案1】:

我想通了。

从 C++11 到 C++14,聚合需要有 no default member initializers。 这就是为什么我无法初始化abc。如果它没有默认成员,它将编译。

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多