gpt4 book ai didi

c++ - 为什么隐式转换在累积中不起作用?

转载 作者:IT老高 更新时间:2023-10-28 23:11:30 26 4
gpt4 key购买 nike

这是 C++ 程序:

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;

int test_string(const string & str) {
return str.size();
}

void main() {
test_string(""); //can compile
vector<string> v;
string sum = accumulate(v.cbegin(), v.cend(), ""); //cannot compile
}

我想在调用通用 STL 函数 accumulate 时使用从 const char *string 的隐式转换。我知道从 const char * 到 string 的转换不是明确的,所以我们可以将 const char * 参数传递给 string 类型的调用是必须的。这可以通过上面的 test_string 函数来证明。但是当我在 accumulate 中做同样的事情时,编译器会提示:

error C2440: '=': cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *'

只有当我将 "" 替换为 string("") 时,该代码才有效。我不明白为什么隐式转换适用于我的自定义函数,但不适用于 accumulate。你能解释一下吗?非常感谢。

PS:我使用的是 Visual Studio 2015。

最佳答案

std::accumulate被声明为

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

这意味着模板参数 T 是从传入的参数推导出来的(即 "")。然后它将是 const char*。另一方面,编译器如何执行隐式转换?哪种类型应该是目标类型?

您可以显式传递 std::string,或显式指定模板参数。例如

// pass a std::string exactly
string sum = accumulate(v.cbegin(), v.cend(), string(""));

// T is specified as std::string explicitly
// "" will be implicitly converted to std::string
string sum = accumulate<decltype(v.cbegin()), string>(v.cbegin(), v.cend(), "");

关于c++ - 为什么隐式转换在累积中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44581672/

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