考虑以下代码片段:
然而在
这是使用
#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和编译器浏览器中测试通过。
预计,在sv1
、sv2
和sv3
中,str + "!"
会触发警告:
Object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]
然而在
sv4
和 sv5
中,使用 {}
的相同表达式却不起作用。这是使用
{}
的预期行为吗?这是clang的一个bug吗?还是我忽略了什么?