char *的字符串构造函数不是隐式调用的?

时间:2015-03-21 03:28:47

标签: c++

我有以下代码。

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编译。

1 个答案:

答案 0 :(得分:8)

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

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的位置。在内部,为了绑定引用,它将创建一个临时字符串,但是当该表达式完成时(并且在从该构造函数返回之前),临时表将消失,您将留下悬空引用。

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

如果你这样做:

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

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