Eigen::VectorXdを戻り値とする関数の出力を受け取る変数の宣言に、型推論を用いた時の挙動についての疑問
<実行環境>
- OS: OSX 10.11.3
- コンパイラ: clang++
以下は、clang++ -vの出力
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
- 非標準ライブラリとして、Eigenを使用(http://eigen.tuxfamily.org/index.php?title=Main_Page)
- C++11の機能を使用
<コード>
#include <iostream>
#include <Eigen/Core>
using namespace std;
using namespace Eigen;
class A{
private:
VectorXd ma;
public:
A(VectorXd a = VectorXd::Ones(1)){
ma = a;
}
VectorXd geta(){
return ma;
}
};
class B : public A{
public:
B(VectorXd a = VectorXd::Ones(1)): A(a){
// In the following line, if you use the type name "VectorXd" and don't use "auto", you can get the normal result.
const auto b = 2 * geta();
// If you release the comment out the following line, even if using the "auto" during initialization of b, you can get the normal result.
// const auto c = geta();
cout << "b = " << b << endl;
cout << "b = " << b << endl;
}
};
int main() {
VectorXd la = 2 * VectorXd::Ones(1);
cout << "la = " << la << endl;
B test = B();
return 0;
}
<実行結果>
- 上記のコードをそのまま実行した場合の出力
la = 2
b = 2
b = 4 - Class Bのコンストラクタ内の変数bの宣言・初期化時に型推論(auto)を使わずに、VectorXdという型を用いた場合の出力
la = 2
b = 2
b = 2 - 変数bの宣言・初期化時には型推論を使用するが、その次の行でconst auto c = geta()という式を評価する場合の出力
la = 2
b = 2
b = 2
<質問内容>
修正を行う前のコードだと、意図していた動作(la及びbの2度の出力結果が同じ値を示す)にならない理由を伺いたです。bに型情報を与えることが解決策になることは、確かめることができましたが、なぜこのような動作になるのかが、未熟な私には理解できません。
ご教示いただけると幸いです。