下面的代碼如何禁止在C++ 2011中調用右值對象的const成員函數?
#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)之後,一個刪除功能聲明可以用來如果向量參數是一個rvalue
std::string const& at(std::vector<std::string>&&, int) = delete;
這看起來好完全禁止向at
呼叫,但下面的代碼仍然會造成碰撞
int main()
{
std::string const& s = mkvec()[0];
std::cout << s << std::endl; // D'oh!
return 0;
}
因爲到右值對象的成員函數調用operator [] (size_type) const
仍允許。有什麼辦法可以禁止這種呼叫嗎?
FIX:
上面的例子是不是我在實際項目中做到了。我只是想知道C++ 2011支持任何成員函數資格像
class A {
void func() rvalue; // Then a call on an rvalue object goes to this overload
void func() const;
};
FIX:
這是偉大的,但我認爲C++標準走得太遠,在此功能。不管怎麼說,我有以下的代碼編譯上鐺++ 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;
}
非常感謝!
我我總是發現這個參考綁定令人震驚。開始的時候一定是個好主意,有時候確實很方便,但是它的破壞潛力是不可思議的,甚至仔細的代碼檢查可能無法檢測到它...:/ – 2011-04-28 06:36:55
感謝你的提示,但我得到了編譯g ++ 4.6.0上的錯誤。你能告訴我哪個編譯器可以處理嗎? – neuront 2011-04-28 07:41:14
如果你將'func'重載公開,那麼clang的最近版本將處理這個例子。 – 2011-04-28 13:29:06