gpt4 book ai didi

c++ - 来自 char* 的字符串的构造函数没有被隐式调用?

转载 作者:太空狗 更新时间:2023-10-29 20:03:27 25 4
gpt4 key购买 nike

我有以下代码。

void print_pair(const std::pair<const std::string&, const int&>& p)
{
std::cout << p.first << "," << p.second << std::endl;
}
print_pair(std::pair<const std::string&, const int&>("test",1));//1
print_pair(std::pair<const std::string&, const int&>(std::string("test"),1));//2

产生以下输出:

,1
test,1

这两行不应该产生相同的输出,因为在第一种情况下,应该隐式调用来自 char* 的字符串的构造函数吗?为什么在第一种情况下 const 引用似乎没有延长第一对参数的生命周期?

它是用 gcc4.9 -std=c++11 -O3 编译的。

最佳答案

问题是你的对是一对引用,而不是值。当你有:

using pair_t = std::pair<const std::string&, const int&>;
pair_t("test",1);

编译器需要找到构造的最佳候选,C++11中的最佳匹配是:

template< class U1, class U2 >
constexpr pair( U1&& x, U2&& y );

其中类型为 U1 = const char(&)[5]U2 = int。在内部,为了绑定(bind)引用,它将创建一个临时字符串,但是当该表达式完成时(并且在从该构造函数返回之前),临时字符串将消失,您将留下一个悬垂的引用。

程序有未定义的行为,它会以与它可能崩溃或打印任何垃圾相同的方式打印空字符串。

在您这样做的情况下:

pair_t(std::string("test"), 1);

创建临时文件的表达式与调用函数的表达式相同,临时文件的生命周期将持续到函数完成,因此第二行是正确的并表现出预期的行为。

关于c++ - 来自 char* 的字符串的构造函数没有被隐式调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com