
El 08/03/2011 23:10, Stephan T. Lavavej escribió:
Can you provide a minimal test case, demonstrating just the bug in question?
This compiles fine in GCC 4.4 and GCC 4.5 in -std=gnu++0x mode, but fails on visual, since conversion provokes the instantiation of conversion_target_movable's (private) copy constructor. I hope this helps: #include <utility> #include <memory> class conversion_source { public: conversion_source(){} }; class conversion_target_movable { conversion_target_movable (const conversion_target_movable&); conversion_target_movable operator=(const conversion_target_movable&); public: conversion_target_movable(){} conversion_target_movable(conversion_source){} conversion_target_movable(conversion_target_movable &&){} conversion_target_movable &operator=(conversion_target_movable &&) { return *this; } }; template<class T> class container { public: void push_back(const T & x) { return priv_push_back(static_cast<const T&>(x)); } void push_back(T &&x) { return priv_push_back(::std::move(x)); } private: template<class U> void priv_push_back(U &&x) { ::new(&t) T(::std::forward<U>(x)); } T t; }; int main() { container<conversion_target_movable> c; { conversion_source x; c.push_back(x); } { const conversion_source x; c.push_back(x); } { c.push_back(conversion_source()); } return 0; } the output is: ------ Build started: Project: move_bug, Configuration: Debug Win32 ------ 1> move_bug.cpp 1>test.cpp(36): error C2248: 'conversion_target_movable::conversion_target_movable' : cannot access private member declared in class 'conversion_target_movable' 1> test.cpp(13) : see declaration of 'conversion_target_movable::conversion_target_movable' 1> test.cpp(12) : see declaration of 'conversion_target_movable' 1> test.cpp(28) : see reference to function template instantiation 'void container<T>::priv_push_back<const T&>(U)' being compiled 1> with 1> [ 1> T=conversion_target_movable, 1> U=const conversion_target_movable & 1> ] 1> test.cpp(28) : while compiling class template member function 'void container<T>::push_back(const T &)' 1> with 1> [ 1> T=conversion_target_movable 1> ] 1> test.cpp(44) : see reference to class template instantiation 'container<T>' being compiled 1> with 1> [ 1> T=conversion_target_movable 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========