【发布时间】:2011-06-10 11:44:07
【问题描述】:
我已阅读 Scott Meyers 编写的 Effective C++ 3rd Edition。
本书的第 3 项,“尽可能使用const”,说如果我们想防止右值被意外分配给函数的返回值,返回类型应该是const。
例如iterator的增量函数:
const iterator iterator::operator++(int) {
...
}
然后,一些事故就被避免了。
iterator it;
// error in the following, same as primitive pointer
// I wanted to compare iterators
if (it++ = iterator()) {
...
}
但是,GCC 中的 std::vector::iterator 等迭代器不会返回 const 值。
vector<int> v;
v.begin()++ = v.begin(); // pass compiler check
这有什么原因吗?
【问题讨论】:
-
无论如何,您都不应该在比较表达式的任何一侧使用 ++。
-
这得到了多少错误答案。
-
它现在是一个过时的技巧,因为它阻止了移动构造。现代的做法是使用
&ref-qualifier 将operator=定义为默认值。 -
@Tom 我不是在拖钓。在你之前的三个人已经接受了他们误解了这个问题。我我是有建设性的,这就是我改变标题的原因。我不回答这个问题,因为我不知道答案。有正当理由吗?
-
我在这里使用了双引号:“可能是因为这些东西是在迈耶的书之前写的,现在修复它已经太晚了!”野外可能有一些代码可以完全满足您想要防止的...
标签: c++ constants return-value