Clang:没有警告 -Wdangling-gsl 和花括号初始化,clang 中的错误?

Clang: no warning with -Wdangling-gsl and curly braces initialization, bug in clang?

考虑以下片段:

#include <string>
#include <string_view>

int main() {
  auto str = std::string{};

  auto sv1 = std::string_view(str + "!"); // <- warning :)
  std::string_view sv2(str + "!");        // <- warning :)
  std::string_view sv3 = str + "!";       // <- warning :)

  auto sv4 = std::string_view{str + "!"}; // <- no warning :(
  std::string_view sv5{str + "!"};        // <- no warning :(
}

编译时带有标记 -std=c++17 -Wdangling-gsl。在编译器资源管理器中的 clang 12.0.1 和主干中测试。

正如预期的那样,在 sv1sv2sv3 中,str + "!" 触发了警告:

Object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]

然而在sv4sv5相同的表达式中,但使用{},却没有。

这是使用 {} 的预期行为吗?这是 clang 中的错误吗?我是不是漏掉了什么?

这是 clang 诊断中的一个错误。在最后两个案例中使用花括号不会 'fix' 悬空指针问题。

通过 'confirmation',Visual Studio/MSVC 中的代码分析工具(静态分析器)对 所有五个 svX变量:

warning C26449: gsl::span or std::string_view created from a temporary will be invalid when the temporary is invalidated (gsl.view).
warning C26815: The pointer is dangling because it points at a temporary instance which was destroyed.