gpt4 book ai didi

c++ - 作为函数参数的引用元组

转载 作者:行者123 更新时间:2023-12-05 08:19:31 25 4
gpt4 key购买 nike

我不太明白为什么下面代码中 func 的第二次调用不起作用:

#include <string>
#include <iostream>
#include <tuple>

using Tuple = std::tuple<const int&, const std::string&>;

void func(const Tuple& t)
{
std::cout << std::get<1u>(t) << std::endl;
}

int main()
{
const int n = 3;
const std::string text = "xyz";

func(Tuple(n, text));

//Does not work:
//func(Tuple(5, "abc"));

return 0;
}

临时字符串"abc"什么时候销毁?

编辑1

所以,最后,根据康桐蔚的说法,这是可行的:

    func(Tuple(5, std::string("abc")));

但这不是:

    Tuple t(5, std::string("abc"));
func(t);

对吧?如果是,有什么区别?

最佳答案

你的第二种情况正是标准想要检测和禁止的。

"abc" 不是 std::string类型,引自 P2255 :

std::tuple<const std::string&> t("meow");

This construction always creates a dangling reference, because thestd::string temporary is created inside the selected constructor oftuple (template<class... UTypes> tuple(UTypes&&...)), and not outsideit. Thus, unlike string_view’s implicit conversion from rvaluestrings, under no circumstances can this construction be correct.

Tuple(5, "abc")由于 P2255,在 C++23 中不再合式 .

为防止破坏临时字符串,您可以显式指定 std::string类型如 func(Tuple(5, std::string("abc"))) .

关于c++ - 作为函数参数的引用元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72960600/

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