【发布时间】:2017-01-18 11:55:19
【问题描述】:
我有一个带有构造函数的类,它接受一个分配给类成员的非常量引用。现在我想创建所述类的 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 引用,然后可以使用在每个有问题的情况下。
【问题讨论】:
-
你可以从非常量到常量,但反之不行。构造函数需要一个非常量,而您的
create_const_a接收一个常量。 -
所有这些引用...如果你继续,你迟早会找到一个指针,在那里你有一个悬空的引用,坏事会发生。 为什么你在
A类中有引用?您试图通过这样的解决方案解决的实际问题是什么? -
您的
create_const_a方法正在返回对本地对象的引用。这并不像您认为的那样起作用。请参阅this answer 了解更多信息。 -
@FrançoisAndrieux 不,它返回对临时对象的引用。幸运的是,它是一个
const引用,它可以延长对象的生命周期,直到使用它的表达式结束。这仍然不是一个好主意,但在这种非常特殊的情况下它会起作用。 -
好的,返回对局部变量的引用显然是无效的,但以某种方式返回 const 引用似乎工作正常。但这是一个单独的讨论,不影响当前问题。我现在更新了问题以删除它。
标签: c++ constructor constants