当我尝试在ideone上编译以下内容时:
class X
{
public:
friend X& operator+=(X& x, const X& y);
};
X& operator+=(X& x, const X& y) { return x; }
int main()
{
X() += X();
}
Run Code Online (Sandbox Code Playgroud)
正如所料,这会引发编译错误,因为您无法将临时传递给非const引用.
但是,以下内容在ideone上成功编译:
std::string() += std::string();
Run Code Online (Sandbox Code Playgroud)
不应该像我上面的例子那样出错吗?
编辑:
如果std :: string()定义+=为成员操作,为什么在这样的用法允许左侧是临时的时候呢?为什么不像我上面那样定义它并避免引用临时问题?
C++规则是您不能将临时绑定到非const引用.但是,您可以在临时对象上调用非const成员函数:如果您将其定义operator +=()为成员,则可以在对象上调用它.这是如何从临时中获取引用的技巧之一,例如,当使用临时std::istringstream读取非基本类型时(基本类型由成员读取):
std::string word;
if (std::istringstream("hello world") >> std::ws >> word) { ... }
Run Code Online (Sandbox Code Playgroud)
(是的,这是一个愚蠢的例子).
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |