以下代码片段来自: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.fold
我知道泛型类型F是一个可调用的,它实现FnMut并接受两个参数:B和Self::Item,这是迭代器迭代的项目,该可调用的返回类型是B。我的问题是关于 的B类型。没有指定,也没有描述任何约束。我是否可以理解它可以是任何类型?
fn fold<B, F>(self, init: B, f: F) -> B
where
Self: Sized,
F: FnMut(B, Self::Item) -> B,
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,编译器抱怨不明确。为什么?显然我正在传递非 const non & 对象。
\n#include <stdio.h>\n#include <ranges>\n#include <vector>\n#include <string>\n#include <iostream>\n\nusing namespace std;\ntemplate<class T>\nstring toStr(const T& obj)\n{\n return obj.toStr();\n}\n\ntemplate<class T>\nstring toStr(T val)\n{\n return std::to_string(val);\n}\nstruct A\n{\n string toStr(){return "A";} \n};\nint main()\n{\n A a;\n\n cout << toStr(static_cast<const A&>(a)) << '\\n';\n\n return 0;\n}\n\nRun Code Online (Sandbox Code Playgroud)\n我尝试在不同的编译器上编译它。效果是相同的。\n我什至尝试将其转换为所需的 const & 类型。没有。
\ncout << toStr(static_cast<const A&>(a)) << '\\n';\nRun Code Online (Sandbox Code Playgroud)\n编辑:
\n> main.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99: main.cpp:35:18: error: call of\n> overloaded \xe2\x80\x98toStr(const A&)\xe2\x80\x99 is ambiguous 35 | cout <<\n> toStr(static_cast<const A&>(a)) << '\\n';\n> | …Run Code Online (Sandbox Code Playgroud)