std::enable_if在Visual Studio 2013中没有正常工作

std::enable_if not working as expected in Visual Studio 2013

本文关键字:常工作 工作 2013 if enable Visual std Studio      更新时间:2023-10-16

我正在用c++编写一个小库,我只希望模板在算术类型上被实例化,我发现了以下问题:

如果我有以下Foo的定义:

template<typename T, typename Enable = void>
class Foo;
template<typename T>
class Foo<T, std::enable_if<std::is_arithmetic<T>::value>::type> {
    Foo() = default;
    Foo( const Foo& ) = default;
    ~Foo() = default;
    template<typename U>
    Foo( std::initializer_list<U> list )
    {
        static_assert(std::is_convertible<U, T>::value, "Must use an initializer list with type convertible to T");
        for( std::size_t s = 0; s < 10; ++s )
        {
            tArray[s] = static_cast<U>(list[s]);
        }
    }
private:
    T       tArray[10];
};

我试着这样初始化它:

int main()
{
    Foo<int> test{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} };
    return 0;
}

我得到以下错误:

Foo<T, std::enable_if<std::is_arithmetic<T>::value>::type>::Foo( std::initializer_list<U> )[与T=int, U=int]不可达

我是新的使用std::enable_if在TMP,但根据cppreference.com看来,这应该工作。我在这里错过了什么,或者这是VS2013的一个bug ?

你的初始化器被声明为private。将其声明为公共的。当使用std::enable_if<>::type时,不要忘记添加typename

编辑:std::initializer_list中没有下标重载

template<typename T, typename Enable = void>
class Foo;
template<typename T>
class Foo<T, typename std::enable_if<std::is_arithmetic<T>::value>::type> {
public:
    Foo() = default;
    Foo( const Foo& ) = default;
    ~Foo() = default;
    template<typename U>
    Foo( std::initializer_list<U> list )
    {
        static_assert(std::is_convertible<U, T>::value, "Must use an initializer list with type convertible to T");
        for( std::size_t s = 0; s < 10; ++s )
        {
            // ERROR
            // tArray[s] = static_cast<U>(list[s]);
        }
    }
private:
    T       tArray[10];
};

这与enable_if无关。在类开始时没有指定任何成员访问控制,默认情况下,class成员(与struct成员相反)是private。只需将public:放在类成员声明之前。