vendredi 27 octobre 2017

Why does failed enable_if lead to compile time error?

I want to disable copy constructor of some template class conditionally. In other words, I want disable copy constructor, if base type is not copy constructible. To solve such problem (in educational purposes) I decided to write following program. (Here is link to ideone http://ift.tt/2y8yjyY) Below is source of my program:

#include <algorithm>
#include <type_traits>

using namespace std;

template <typename Data>
class Container
{
public: 
    typedef Container<Data> self_type;

    Container(): 
        m_data()
    {
    }

    Container(const typename 
std::enable_if<std::is_copy_constructible<Data>::value, 
            self_type>::type& other_data) : 
        m_data(other_data.m_data)
    {
    }

    Container(self_type&& other)
    {
        std::swap(m_data, other.m_data);
    }

private:
    Data m_data;
};

class SomeData
{
public:
    SomeData(){}
    SomeData(const SomeData&) = delete;
};

int main() 
{
    Container<SomeData> container;
    return 0;
}

But message from compiler really confuses me:

prog.cpp: In instantiation of ‘class Container’: prog.cpp:41:22: required from here prog.cpp:17:2: error: no type named ‘type’ in ‘struct std::enable_if >’ Container(const typename std::enable_if::value

As I understand it should lead to SFINAE and nothing should be arised from compiler. Where am I wrong?

Aucun commentaire:

Enregistrer un commentaire