Здравствуйте, Molchalnik, Вы писали:
эта стандартная проблема имеет стандартное решение
#include <iostream>
using namespace std;
struct Any {
Any( ) {cout << "\ndefault";}
template <typename Tn, typename = std::enable_if_t<!std::is_convertible<Tn, Any>::value>> Any( Tn && ) {cout << "\ntemplate";}
Any( const Any & ) {cout << "\ncopy";}
Any( Any&& ) {cout << "\nmove";}
};
int main() {
Any x0;
Any x1( x0 );
Any x2( std::move(x0) );
Any x3( 3 );
return 0;
}
проблема не в том, что заменяется конструктор копирования. Просто для неконстантного объекта лучшим соответствием считается шаблонный конструктор. Если в примере поставить Any const x0 то всё будет также работать — конструктор вызовется