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 > > > ' 除了(is_nothrow_move_constructible::value); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ 在文件中包含在 /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:注意:在此处要求 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::value); ^ 在/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:注意:在此处要求 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, 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::value); ^ 在/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:注意:在此处要求 std::vector vectorFoo_ 的“向量”的异常规范的实例化中;

我的编译器从树顶发出叮当声。我究竟做错了什么?

谢谢

更新 Coliru 上的错误。如果我不指定 libc++ 而是使用 stdlibc++ 它会编译。它开始看起来很像 libc++ 中的错误。

4

2 回答 2

5

代码很好。(而且,有趣的是,libc++ 也是如此)

原来这是clang中的一个错误;事实上,最新版本的 clang 在尝试编译此代码时会崩溃。

目前正在测试一个在 clang 中修复此问题的补丁,并将作为 3.4 版本的一部分。如果您不能等待那么久,那么如果您愿意从源代码构建它,那么您应该能够“现在很快”获得一个固定版本的 clang。

感谢 Nuanti 的 Alp 跟踪了 clang 错误。

于 2013-10-10T18:56:23.593 回答
3

我的第一个假设是,这可能是因为移动赋值运算符 for std::stringis not 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 回答