以下代码
#include <vector>
#include <string>
#include <iostream>
std::string const& at(std::vector<std::string> const& n, int i)
{
return n[i];
}
std::vector<std::string> mkvec()
{
std::vector<std::string> n;
n.push_back("kagami");
n.push_back("misao");
return n;
}
int main()
{
std::string const& s = at(mkvec(), 0);
std::cout << s << std::endl; // D'oh!
return 0;
}
可能会导致崩溃,因为原始向量已经在那里被破坏。在引入右值引用后的 C++ 2011 (c++0x) 中,如果向量参数是右值,则可以使用已删除的函数声明来完全禁止调用at
std::string const& at(std::vector<std::string>&&, int) = delete;
看起来不错,但是下面的代码仍然会导致崩溃
int main()
{
std::string const& s = mkvec()[0];
std::cout << s << std::endl; // D'oh!
return 0;
}
因为operator [] (size_type) const
仍然允许调用右值对象的成员函数。有什么办法可以禁止这种电话吗?
使固定:
上面的例子不是我在实际项目中所做的。我只是想知道 C++ 2011 是否支持任何符合条件的成员函数
class A {
void func() rvalue; // Then a call on an rvalue object goes to this overload
void func() const;
};
使固定:
这很棒,但我认为 C++ 标准在这个特性上走得太远了。无论如何,我在 clang++ 2.9 上编译了以下代码
#include <cstdio>
struct A {
A() {}
void func() &
{
puts("a");
}
void func() &&
{
puts("b");
}
void func() const &
{
puts("c");
}
};
int main()
{
A().func();
A a;
a.func();
A const b;
b.func();
return 0;
}
非常感谢!