問題は、引数Ts&&...
がMyClass<T,nb>&
(つまり非const)と一致する可能性があることです。これは、auto b = a;
とそれに類するもの(aはconstではないため)の場合に、より良い一致になります。
だから、いくつかのSFNAEの魔法で、その場合を無効にするか、正しいことをして、特定の過負荷を提供する必要があります、次のいずれか
期待出力
#include <memory>
#include <string>
#include <iostream>
template<typename T, int nb = 1>
class MyClass
{
/* ... some stuff here ... */
public:
template<typename... Ts>
MyClass(Ts&&... ts)
: _pstr(std::make_shared<std::string>(std::forward<Ts>(ts)...))
{
}
// match the specific case, and force a copy
MyClass(MyClass<T, nb>& r)
: MyClass(static_cast<const MyClass<T, nb>&>(r))
{}
// and now we must match all copy/move operations
MyClass(const MyClass<T, nb>&) = default;
MyClass& operator=(const MyClass<T, nb>&) = default;
MyClass(MyClass<T, nb>&&) = default;
MyClass& operator=(MyClass<T, nb>&&) = default;
void print() const {
std::cout << *_pstr << std::endl;
}
private:
std::shared_ptr<std::string> _pstr;
};
// test
int main()
{
auto a = MyClass<int>("hello, world");
auto b = a;
auto c = MyClass<int>("goodbye");
auto d = c;
b = c;
a.print();
b.print();
c.print();
d.print();
}
:
hello, world
goodbye
goodbye
goodbye
簡単に、あなたがほとんどでした'MyClass(MyClass && source)/ * ...ここにいくつかのものがあります。* /' –
何が問題なのですか?可変コンストラクタは移動コンストラクタと何をするのですか? – 101010
'tmp'オブジェクトをビルドするにはどうしたらいいですか?私はそこに置くべき引数がどれくらいあるのかよくわかりません。ソースの内部状態に応じて手動で適切なコンストラクタを呼び出すだけでいいですか?どのようにtmpを構築するためにコンストラクタを呼び出すのですか?いくつの引数がありますか? – MCF