当使用 -std=c++17 -Werror -Wconversion
编译时,GCC 7.2 和 clang 5.0 似乎不同意以下代码:
#include <iostream>
#include <string>
#include <string_view>
int main(int argc, char* argv[]) {
std::string s = "Hello, World";
std::string_view vs{s};
std::cout << std::string{vs} << '\n';
return EXIT_SUCCESS;
}
使用 clang++ -std=c++17 -Wall -Werror -Wconversion
编译,编译正确(参见 https://godbolt.org/g/JZn8cL )
但是,GCC 7.2 发布了一个有点令人费解的诊断(请参阅 https://godbolt.org/g/kmYbJ3):
<source>: In function 'int main(int, char**)':
7 : <source>:7:26: error: choosing 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::__sv_type() const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::__sv_type = std::basic_string_view<char>]' over 'constexpr std::basic_string_view<_CharT, _Traits>::basic_string_view(const std::basic_string_view<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]' [-Werror=conversion]
std::string_view vs{s};
^
7 : <source>:7:26: error: for conversion from 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'std::basic_string_view<char>' [-Werror=conversion]
7 : <source>:7:26: note: because conversion sequence for the argument is better
cc1plus: all warnings being treated as errors
Compiler exited with result code 1
将 vs{s}
更改为 vs(s)
后,两个编译器都能正常编译代码。
哪个编译器就在这里?是否从 std::string
以某种方式运行与转换规则冲突的 std::string_view
的大括号初始化,并且 clang 在可以/应该时未能发出诊断?还是GCC出错,诊断错误?
最佳答案
Which compiler is right here?
两者都有?编译器可以根据自己的选择发出警告或不发出警告。只是当你写的时候:
std::string_view vs{s};
您可能会认为这是在执行聚合初始化或至少调用 string_view
构造函数之类的操作,但事实并非如此 - 如果您编写了这种印象,则不太可能发生:
std::string_view vs(s);
所以 gcc 给你一个警告(因为你要求一个)。
代码很好。两个编译器都很好。只需使用 ()
进行初始化,没有理由在这里使用 {}
(两种方法的行为没有区别)。
关于c++ - 从大括号 std::string 构造 std::string_view,clang 和 gcc 不同意 -Wconversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47292529/