4

これは、この質問のフォローアップです。

C ++での関数転送の問題に関する2002年の論文では、次のように述べています。

これは、Boost.BindとBoost.Lambdaで現在採用されている方法です。

template<class A1, class A2, class A3> void f(A1 & a1, A2 & a2, A3 & a3)
{
    return g(a1, a2, a3);
}

その主な欠点は、非定数値を転送できないことです。引数の演繹は非定数参照を作成し、参照は引数にバインドできません。これは無実の例を次のように作成します

int main()
{
    f(1, 2, 3);
}

失敗します(C1に違反します)。

呼び出しが失敗したようですが、説明は正しいですか?リテラル1、2、3 const rvaluesではありませんか?

4

1 に答える 1

6

Are not the literals 1, 2, 3 const rvalues?

いいえ、それらはint型の単なる右辺値です。C ++標準によると、プリミティブ型の右辺値は定数修飾できません。

それらは右辺値であるため、呼び出しは失敗します。非定数参照を右辺値にバインドすることはできません。

関数がをとった場合、呼び出しはOKですconst A1 &, const A2&, const A3&が、この場合、関数は引数を変更できません。

編集: C ++ 2003標準からの私の最初のステートメントへの参照:(3.10.9)

クラス右辺値は、cv修飾型を持つことができます。非クラスの右辺値には、常にcv-unqualifiedタイプがあります。右辺値は常に完全型またはvoid型でなければなりません。これらのタイプに加えて、左辺値も不完全なタイプを持つ可能性があります。

于 2011-03-08T16:24:00.247 に答える