ref-qualified関数のオーバーロードで作業している間に、とClang(2.9とトランク)とは異なる結果になります。次のコードを考えてみましょう:ref-qualifierでのオーバーロードの解決
#include <iostream>
#include <utility>
struct foo
{
int& bar() &
{
std::cout << "non-const lvalue" << std::endl;
return _bar;
}
//~ int&& bar() &&
//~ {
//~ std::cout << "non-const rvalue" << std::endl;
//~ return std::move(_bar);
//~ }
int const& bar() const &
{
std::cout << "const lvalue" << std::endl;
return _bar;
}
int const&& bar() const &&
{
std::cout << "const rvalue" << std::endl;
return std::move(_bar);
}
int _bar;
};
int main(int argc, char** argv)
{
foo().bar();
}
をクランGCCが、これは2 const修飾の機能が最良の実行可能な候補者であることの両方を持つあいまいな呼び出しであると考えている間、その出力"const rvalue"
をコンパイルします。 4つのオーバーロードをすべて提供すると、両方のコンパイラは"non-const rvalue"
を出力します。
- 何でも -が正しいことをしているのか、そして関連する標準のものが何であるか知りたいのですが。
注:これは実際に重要理由は、実際のコードがconstexpr
として、両方のconst修飾関数を宣言していることです。もちろん、std::move
の代わりにstd::cout
とstatic_cast
への出力がないので、有効なconstexpr
の定義になります。 のC++ 11constexpr
にはまだconst
が含まれているので、サンプルコードでコメントアウトされたオーバーロードは、const修飾されたrvalueオーバーロードを再定義するため、提供できません。
すべての場合において、正の値の参照がよりよく一致します。これはおそらくGGCのref-qualifierのバグです。 – Xeo
また、[この回答](http://stackoverflow.com/a/8610728/500104)が適切かもしれません。 ;) – Xeo
詳細な回答ありがとうございます。私はそれを何回もupvoteできればいいと思うよ! –