在尝试使用包装器模板删除构造函数的行为时,我偶然发现了这个奇怪的问题:
#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