私はクラスのメンバに割り当てられた非const参照をとるコンストラクタを持つクラスを持っています。今私は、上記のクラスのconstオブジェクトを作成するが、私はコンストラクタにconstリファレンスを渡す場合、コンストラクタは、文句を言う。私の元のコードを単純化した以下のコードは、この問題を示しています。非constを使用したconstオブジェクトの作成
constデータをベースにしているので、constオブジェクトの作成に問題はありません。
私はcreate_const_a
で何をしようとしていますか?
#include <iostream>
class A {
private:
double &d;
const int &i;
public:
A(double &dd, const int &ii)
: d(dd), i(ii)
{}
void set_d(double a) {
d = a;
}
void print() const {
std::cout << d << " " << i << std::endl;
}
};
A create_a(double &dd, const int &ii) {
return A(dd,ii);
}
const A create_const_a(const double &dd, const int &ii) {
return A(dd,ii);
}
void foo(A a)
{
a.set_d(1.3);
a.print();
}
void bar(const A a)
{
a.print();
}
int main(int argc, char *argv[])
{
double d = 5.1;
int i = 13;
foo(create_a(d,i));
bar(create_const_a(d,i));
return 0;
}
私が手にエラーがある:
test.cc: In function ‘const A create_const_a(const double&, const int&)’:
test.cc:27:17: error: binding ‘const double’ to reference of type ‘double&’ discards qualifiers
return A(dd,ii);
^
test.cc:8:3: note: initializing argument 1 of ‘A::A(double&, const int&)’
A(double &dd, const int &ii)
^
更新:constのオブジェクトとその中の非const参照でどのように機能するかについて、いくつか新しいことを学んだ後、私は最終的に元の問題を解決しました別のタイプ、例えばConstA
を導入することで、問題のあるケースで使用できるconst参照のみが含まれています。
非constからconstに変更できますが、その逆は変更できません。コンストラクタは非constを必要とし、 'create_const_a'はconstを受け取ります。 – AndyG
これらのすべての参考文献...続行すると、遅かれ早かれ、参照が足りなくて悪いことが起こるようなポインタが出てくるでしょう。 *なぜあなたは 'A'クラスのリファレンスを持っていますか?このような解決策で解決しようとしている*実際の問題は何ですか? –
'create_const_a'メソッドがローカルオブジェクトへの参照を返しています。これは、あなたが思っているように見えるようには機能しません。詳細については、[この回答](http://stackoverflow.com/a/4643721/7359094)を参照してください。 –