2

テンプレート化されたクラスがあると仮定します

template <typename T>
struct Dummy {
    // ...
};

そして、関数'foo'をオーバーロードして、その左辺値または右辺値の参照を受け入れるようにします。私は次のようにいくつかのIsDummy特性を使用してこれを行うことができます:

template <typename A>
std::enable_if<IsDummy<A>::value, void>
foo(A &&dummy)
{
    // ....
}

一部のC++11ドラフトのIIRCは、

template <typename A>
foo(Dummy<A> &&dummy)
{
    // ....
}

左辺値と値の両方の参照を受け入れます。

今私の質問:

  • a)ドラフトで許可されたのは正しいですか?

  • b)この機能/バグが削除されたのはなぜですか?「コンセプト」との葛藤が原因だったとどこかで読んだと思います。

しかし、私はこれについての適切な参照をもう見つけることができません。誰かがより良い記憶やブックマークを持っていますか?

4

2 に答える 2

3

a)ドラフトで許可されたのは正しいですか?

はい、「右辺値参照1.0」として知られているもので許可されていました(N2118を参照)。

b)この機能/バグが削除されたのはなぜですか?「コンセプト」との葛藤が原因だったとどこかで読んだと思います。

右辺値参照を左辺値にバインドすると、概念が存在する場合に「タイプセーフなオーバーロードの原則」に違反する可能性があるため、削除されました。

すべての関数は、どのようにオーバーロードされたかに関係なく、単独でタイプセーフである必要があります。

たとえば、次のオーバーロードを定義するとします。

template< CopyConstructible T > void f( T const & t ); // #1
template< MoveConstructible T > void f( T && t );      // #2

次に、コピー可能な左辺値を使用して呼び出すfと、#1が選択されます。ただし、Tがコピー不可能な型(たとえばstd::unique_ptr)の場合、#1は実行可能なオーバーロードではないため、コンパイラは#2を選択する必要があり、警告なしに左辺値からリソースを盗む可能性があります。

詳細については、「右辺値参照2.0」(N2844)を参照してください。

于 2012-10-03T01:45:06.407 に答える
0

Andrewの回答からの情報を持っていると、この主題に関する非常に読みやすい記事(rvalue- / lvalue-references)も見つかりました。これは、この問題で物事がどのように進化したかについての参照も提供します。

于 2012-10-03T19:33:14.430 に答える