問題
以下のソースコードを実行すると正しく"a"と出力されます。
cpp
1#include <vector> 2#include <iostream> 3#include <string> 4using namespace std; 5 6class Test { 7public: 8 string s; 9 Test(string s) : s(s) { } 10 string toString() { 11 return s; 12 } 13}; 14class Test2 { 15public: 16 Test t; 17 Test2(Test t) : t(t) { } 18 string toString() { 19 return t.toString(); 20 } 21}; 22 23int main() { 24 Test2 t(Test("a")); 25 cout << t.toString() << endl; 26 27 // 終了待ち用 28 getchar(); 29}
この中のTest2クラスを以下の様に変えると何も出力されずに終了します。
cpp
1class Test2 { 2public: 3 Test &t; 4 Test2(Test &t) : t(t) { } 5 string toString() { 6 return t.toString(); 7 } 8};
できればTest2 t(Test("a"));
のように初期化をしたく、かつ、参照渡しをしたいのですが、2番目のクラスではなぜ何も出力されずに終了するのでしょうか。
それとも参照渡しは諦め、値渡しかポインタ渡しをした方が良いのでしょうか。
###補足情報(言語/FW/ツール等のバージョンなど)
環境は
Visual Studio Community 2017 Version 15.1 (26403.7) Release
.NET Framework Version 4.7.02046
です。
ご助力よろしくお願いいたします。
解決後追記: lvalueとrvalue
これでコンパイルが通ってしまうのはVisual Studioの独自仕様らしい。
C++の仕様の観点からもこの代入は正しくない。
本の虫: rvalue reference 完全解説
回答1件
あなたの回答
tips
プレビュー