我遇到了在Ubuntu 16.04 LTS(服务器)上编译的问题。如果我不包含-std=c++11
位,它编译好。 Clang版本是3.8。
>cat foo.cpp
#include <string>
#include <iostream>
using namespace std;
int main(int argc,char** argv) {
string s(argv[0]);
cout << s << endl;
}
>clang++ -std=c++11 -stdlib=libc++ foo.cpp
In file included from foo.cpp:1:
/usr/include/c++/v1/string:1938:44: error: 'basic_string<_CharT, _Traits, _Allocator>' is missing exception specification
'noexcept(is_nothrow_copy_constructible<allocator_type>::value)'
basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
^
/usr/include/c++/v1/string:1326:40: note: previous declaration is here
_LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)
^
1 error generated.
答案 0 :(得分:22)
直到Mike Kinghan的回复中提到的Debian错误得到解决,只需手动将缺少的(但必需的)noexcept
规范添加到ctor定义中,即可解决问题,即您只需添加
#if _LIBCPP_STD_VER <= 14
_NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
#else
_NOEXCEPT
#endif
在/usr/include/c++/v1/string
的第1938行之后。
答案 1 :(得分:20)
你已经在ubuntu 16.04上安装了libc++-dev
(正确)期望它应该
让您使用clang++
及其标题为libc++
进行构建
标准库。
应该,但在std=c++11
(或更高标准)的情况下,它
因为Debian bug #808086而没有,
你遇到了什么。
如果您希望使用clang++
编译到C ++ 11标准或更高版本,那么
直到ubuntu得到一个修复,你必须在没有libc++
的情况下使用
相反,libstdc++
(GNU C ++标准库),这是默认行为。
clang++ -std=c++11 foo.cpp
或:
clang++ -std=c++11 -stdlib=libstdc++ foo.cpp
会奏效。