c++ - 从大括号 std::string 构造 std::string_view,clang 和 gcc 不同意 -Wconversion

标签 c++ c++11 gcc clang c++17

当使用 -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/

相关文章:

c++ - 获取回调函数的返回类型

c++ - makefile 的问题

c++ - 使用configure文件生成makefile

GCC 目录选项 -isystem

c++ - 模板 C++ 类声明中的类型/值不匹配

python - 如何让 Python 将数组插入到 *.c 文件中?

c++ - FFTW 3.3.3 真实数据的基本用法

c++ - qt:对 'mysql_something@nr' 的 undefined reference

c++ - boost thread_group 将 unique_ptr 的所有权移动到线程

c++ - 当一个函数没有为 1 个输入参数提供 1 个输出参数时,如何使 "compose"起作用?