【发布时间】:2013-01-26 04:29:59
【问题描述】:
考虑以下模式:
class Child
{
public:
char Foo;
Child(char foo)
{
Foo = foo;
}
};
class Parent
{
public:
Child c;
Parent() : c('A') { }
const Child& GetChild() const
{
return c;
}
};
// Scenario 1: Works, but useless
int main()
{
Parent p = Parent();
Child c = p.GetChild();
c.Foo = 'B';
cout << p.c.Foo << endl; // A, wrong
cout << c.Foo << endl; // B, good
system("PAUSE");
}
// Scenario 2: Doesn't compile, of course
int main()
{
Parent p = Parent();
Child& c = p.GetChild(); // Error
c.Foo = 'B';
cout << p.c.Foo << endl; // A, good
cout << c.Foo << endl; // B, good
system("PAUSE");
}
规格如下:
- getter 必须定义为 const(因为它不修改 Parent)
- getter 给出的引用必须修改底层值
问题是:
- 如果 getter 本身是 const,C++ 要求 getter 的返回值是 const(为什么?)
- C++ 禁止将 const 值分配给引用(逻辑上)
使用指针很容易实现这一点(让访问器返回Child*),但似乎有一个共识(而且理所当然地)认为引用是可取的,因为它们隐藏了指针的复杂性。
有什么办法吗?如果没有,我将恢复为指针。
【问题讨论】:
-
我认为您没有 C++11 实现,因此可以将
Child c;成员变量标记为mutable并将 getter 更改为Child& getChild() const { return c; }? -
@WhozCraig 这在 C++11 中是禁止/不可能的吗?
-
它很可能(很小的机会)是 UB,我必须检查一下,但我记得可变成员的全部意义在于即使在 const 环境中也允许它们不热。很确定做我上面发布的事情是合法的。我当然希望这不是不可能的,因为如果是这样的话,我的工具链就很糟糕了。
-
@WhozCraig:这不是 C++11 的新特性。
-
@BenjaminLindley
mutablememvars 在 11 点之前就已经存在了? Jeezors 我需要多出去走走。
标签: c++ pointers reference pass-by-reference