10

最近、Visual Studio 2010 Professional RCをインストールして、VC++2010に実装されているいくつかのC++0x機能を試してテストしました。

のを問題なくインスタンス化しましたstd::vectorstd::unique_ptrただし、一時をに渡してデータを設定しようとするとpush_back、コンパイラはのコピーコンストラクタunique_ptrがプライベートであると文句を言います。左辺値を動かして挿入してみましたが、問題なく動作します。

#include <utility>
#include <vector>

int main()
{
    typedef std::unique_ptr<int> int_ptr;

    int_ptr pi(new int(1));

    std::vector<int_ptr> vec;

    vec.push_back(std::move(pi));      // OK
    vec.push_back(int_ptr(new int(2))); // compiler error
}

結局のところ、問題は、次のコードで示されているように、右辺値を処理するときにVC++が過負荷を解決する方法でもありませunique_ptrん。vector::push_back

struct MoveOnly
{
    MoveOnly() {}
    MoveOnly(MoveOnly && other) {}

private:

    MoveOnly(const MoveOnly & other);
};

void acceptRValue(MoveOnly && mo) {}

int main()
{
    acceptRValue(MoveOnly()); // Compiler error
}

コンパイラは、コピーコンストラクタにアクセスできないと文句を言います。公開すると、プログラムがコンパイルされます(コピーコンストラクターが定義されていなくても)。

右辺値参照について何か誤解しましたか、それともこの機能のVC ++ 2010実装の(おそらく既知の)バグですか?

4

3 に答える 3

12

残念ながら、/Zaはバグがあります。すべきでないときに、elided-copy-constructor-accessibilityチェックを実行します(右辺値参照をバインドしても、理論的にもコピーコンストラクターは呼び出されません)。したがって、/Zaは使用しないでください。

Stephan T. Lavavej、Visual C ++ライブラリ開発者(stl@microsoft.com)

于 2010-04-26T19:25:08.523 に答える
1

まず第一に、あなたは閉じる必要があります)

vec.push_back(int_ptr(new int(2)) ; //コンパイラエラー

これで、最初のケースでも2番目のケースでもコンパイラエラーは発生しません。

Visual Studio2010Betaを使用しています。

于 2010-04-21T11:52:56.587 に答える
1

言語拡張機能(\ Za)を無効にしていることに気づきました。拡張機能を有効にすると、コードは正しくコンパイルされます。ここに示されているコードは(私が知る限り)完全に標準であり、Microsoftの拡張機能に依存していないため、これはまだバグだと思います。

于 2010-04-21T14:57:29.973 に答える