为什么在尝试使用已删除的移动构造函数进行复制构造时,右值的构造函数是否重要?

时间:2015-03-11 14:48:55

标签: c++ constructor overloading c++14

在尝试使用包装器模板删除构造函数的行为时,我偶然发现了这个奇怪的问题:

#include <utility>

template <typename T>
struct Foo
{
    T t;
    Foo(const T& t) : t(t) { }
    Foo(T&& t) : t(std::move(t)) { }
};

struct Bar
{
    Bar() { }
    Bar(int) { }
    Bar(const Bar&) = default;
    Bar(Bar&&) = delete;
};

int main()
{
    Foo<Bar> foobar1(Bar()); //compiles fine, using the Bar copy constructor
    Foo<Bar> foobar2(Bar(5)); //error: use of deleted function 'Bar::Bar(Bar&&)

    return 0;
}

我可以理解为什么它会选择移动构造函数,但是当我使用Bar()或Bar(5)时它为什么表现不同?这是预期的,未定义的还是错误的行为?

我在ideone.com上使用C ++ 14进行了测试,他们使用gcc 4.9.2:https://ideone.com/9CS56F

0 个答案:

没有答案