gpt4 book ai didi

c++ - 以下 Variadic 模板行为是否不一致?

转载 作者:太空狗 更新时间:2023-10-29 20:08:52 26 4
gpt4 key购买 nike

我正在尝试以下示例来理解可变参数模板,但发现行为有些不一致。

#include <iostream>
#include <string>
using namespace std;

template<typename T>
T adder(T v) {
return v;
}

template<typename T, typename... Args>
T adder(T first, Args... args) {
return first + adder(args...);
}

int main()
{
long sum = adder(1, 2, 3, 8, 7); //Works
cout << sum << endl;

string s1 = "xx", s2 = "aa", s3 = "bb", s4 = "yy";

string ssum = adder(s1, s2, s3, s4); //Works
cout << ssum << endl;

string ssum2 = s1 + s2 + "3" + "4"; //Works as operator '+' is defined in string class for const char*
cout << ssum2 << endl;

string ssum3 = adder(s1, s2, "3", "4"); //Does not work. Expected as binary 'operator+' is not defined for string and const char*
cout << ssum3 << endl;

string ssum4 = adder("3", "4"); //Does not work. Expected as binary 'operator+' is not defined for const char* and const char*
cout << ssum4 << endl;

string ssum5 = adder(s1, s2, "3"); //Works!!!
cout << ssum5 << endl;

}

ssum3ssum4 调用 adder 失败,但对 ssum5 有效。这种行为是否一致?发生这种情况是因为 ssum5 的最后一个参数在最后一次迭代时被转换为 string 吗?

最佳答案

Is it happening because the last argument for ssum5 is converted into string at the final iteration?

不,它起作用是因为 std::operator+(std::basic_string)重载以获取 std::string 和原始字符串 (const char*)。给定 s2 是一个 std::string,那么 s2 + "3""3"+ s2工作正常。所以 ssum5 可以工作,因为最后递归它会被解释为 s2 + "3",这很好。

问题是您不能将两个连续的原始字符串传递给 adder。对于 ssum3ssum4,你传递的是 "3""4",最后它们将是解释为 "3"+ "4",这显然不起作用。

关于c++ - 以下 Variadic 模板行为是否不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51836479/

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