3

この単純なコードをコンパイルするとエラーが発生します。noexcept を削除すると、エラーは発生しません。

#include<vector>
#include<string>
class Foo
{
public:

protected:
   Foo(Foo&&) noexcept = default;
   Foo& operator=(Foo&&) noexcept = default;

   Foo()
   {
   }

private:

   std::vector<std::string> vectorFoo_;
};

これは私が受け取るエラーです。例外仕様のインスタンス化にあることは理解していますが、std::string が構築可能ではないことを疑っています..最初のエラーは、バグがあると思わせます。

/Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:575:67: エラー: 'std::__1::is_nothrow_move_constructible、std::__1::allocator に 'value' という名前のメンバーがありません > > > ' NOEXCEPT(is_nothrow_move_constructible::値); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ファイル内/Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 から含まれる: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 から含まれるファイル内: ファイル内/usr/local/bin/../lib/c++/v1/vector:264 からインクルード: /usr/local/bin/../lib/c++/v1/__config:325:34: 注: マクロから展開 ' NOEXCEPT ' NOEXCEPTを定義(x) noexcept(x) ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 から含まれるファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError. h:29:29: 注: ここでリクエストされた 'vector' の例外仕様のインスタンス化で std::vector vectorFoo_; ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:265 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/__bit_reference:15 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/algorithm:624 から含まれるファイル: /usr/local/bin/..Tp>::type> ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル内: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics からインクルードされたファイル内/TestCompileError.h:4: /usr/local/bin/../lib/c++/v1/vector:575:20: 注: テンプレート クラスのインスタンス化で 'std:: _1::is_nothrow_move_constructible, std::__1: :allocator > > >' ここで要求 NOEXCEPT(is_nothrow_move_constructible::値); ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:264 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/__config:325:34: 注: 展開マクロ ' NOEXCEPT ' からNOEXCEPTを定義します(x) noexcept(x) ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 から含まれるファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError. h:29:29: 注: ここでリクエストされた 'vector' の例外仕様のインスタンス化で std::vector vectorFoo_; ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:582:58: エラー: 'std::__1::is_nothrow_move_assignable に 'value' という名前のメンバーがありません, std::__1::allocator > > >' is_nothrow_move_assignable::value);NOEXCEPT ' NOEXCEPTを定義(x) noexcept(x) ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 から含まれるファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError. h:29:29: 注: ここで要求された「operator=」の例外指定のインスタンス化で std::vector vectorFoo_; ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:265 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/__bit_reference:15 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/algorithm:624 から含まれるファイル: /usr/local/bin/.. /lib/c++/v1/type_traits:2760:45: 注: テンプレート クラス 'std::__1::add_lvalue_reference, std::__1::allocator > > >' のインスタンス化では、ここで要求されます: public is_nothrow_assignableTp>::type, ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:582:14: 注: テンプレート クラスのインスタンス化で 'std::_1::is_nothrow_move_assignable, std::__1::allocator > > >'ここで要求されます is_nothrow_move_assignable::value); ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 から含まれるファイル:NOEXCEPT ' NOEXCEPTを定義(x) noexcept(x) ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 から含まれるファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError. h:29:29: 注: ここで要求された「operator=」の例外指定のインスタンス化で std::vector vectorFoo_; ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:265 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/__bit_reference:15 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/algorithm:624 から含まれるファイル: /usr/local/bin/..Tp>::type> ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル内: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics からインクルードされたファイル内/TestCompileError.h:4: /usr/local/bin/../lib/c++/v1/vector:575:20: 注: テンプレート クラスのインスタンス化で 'std:: _1::is_nothrow_move_constructible, std::__1: :allocator > > >' ここで要求 NOEXCEPT(is_nothrow_move_constructible::値); ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 からインクルードされたファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.h:4 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/vector:264 からインクルードされたファイル: /usr/local/bin/../lib/c++/v1/__config:325:34: 注: 展開マクロ ' NOEXCEPT ' からNOEXCEPTを定義します(x) noexcept(x) ^ /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError.cpp:1 から含まれるファイル: /Users/Mani/Development/Projects/flowOfLife/Graphics/Graphics/TestCompileError. h:29:29: 注: ここでリクエストされた 'vector' の例外仕様のインスタンス化で std::vector vectorFoo_;

私のコンパイラはツリーの一番上からclangです。私は何を間違っているのですか?

ありがとう

更新 Coliru のエラー。libc++ を指定せず、代わりに stdlibc++ を使用するとコンパイルされるようです。libc ++のバグのように見え始めています。

4

2 に答える 2

3

私の最初の仮定は、これは、移動代入演算子 forstd::stringが noexcept ではないためである可能性があります (以下を確認する必要があります)。

少なくとも、clang と gcc はこれの方が気に入っているようです。

Bar& operator = (Bar&&) 
     noexcept(
         noexcept(std::declval<std::string>() = std::string())
     ) = default;

さて、Foo の clang と gcc は完全には一致しませんが、Clang は coliru でライブです

プロットツイスト

さらなる考察: 標準では、std::string の代入演算子 (およびムーブ コンストラクター) を次のように明示的に指定しているようnoexceptです: § 21.4.2

http://i.imgur.com/lmjq3dX.png

于 2013-09-22T22:49:58.370 に答える