0からの、超初心者C++相談室at TECH0からの、超初心者C++相談室 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト775:デフォルトの名無しさん 24/01/28 17:03:17.17 eBJAlicu.net >>769 いつもありがとうございます。 たいていはデフォルトでよさそうですね。 std::vectorは可変長配列ってことなので、<int>であってもデフォルトでいいのかなと心配に…あこれはvectorのほうで独自=定義されてるなら問題ないわけですね。 776:デフォルトの名無しさん 24/01/30 20:47:22.29 RcbbllHt.net bだけ通らないのが納得いかない…。 #include<iostream> #include<functional> using F = std::function<void()>; void f0(){} F f1; class X { F f; public: X(const F& f_) : f(f_){} X& operator=(const F& f_){f = f_; return *this;} }; int main(){ X x1(f0); // a:OK X x2 = f0; // b:NG(conversion from ‘void()’ to non-scalar type ‘X’ requested) X x3 = f1; // c:OK x1 = f0; // d:OK } 777:はちみつ餃子 24/02/02 00:09:46.55 BQKaaqcl.net >>771 std::function ではなくごく単純なクラスでもエラーを再現できる。 暗黙の変換は原則としては多段には起こらず、 X→Y, Y→Z な変換が可能なときでも X→Z な変換はしない。 (プリミティブな型変換とクラスの型変換が連鎖することはある。) 以下の例だと X x1(1); という宣言のときに必要な「暗黙の変換」は int から foo という一段のものだけど X x2 = 2; としたときに必要なのは int から X だから一段の変換ではできない。 struct foo { foo(int x) {} foo(const foo&) = default; foo(void) = default; }; foo f1; class X { foo f; public: X(const X&) = default; X(const foo& f_) : f(f_) {} X& operator=(const foo f_) { f = f_; return *this; } }; int main() { X x1(1); // a:OK X x2 = 2; // b:NG(conversion from 'int' to non-scalar type 'X' requested) X x3 = f1; // c:OK x1 = 3; // d:OK } 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch