gpt4 book ai didi

c++ - std::find 是否隐式修复无效参数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:41 26 4
gpt4 key购买 nike

所以我遇到了一个非常奇怪的情况,我的一个程序正在工作,但据我所知,它根本不应该。因此,这个问题只是因为我想更好地了解我正在做的事情的背景(因为我现在真的很困惑)。

假设我有一个看起来像这样的类:

class Foo{
private:
string s;
public:
Foo(string s);
};

我有一个包含此类元素的 vector ,如下所示:

vector<Foo> myFoos = {...};

现在,我想在知道字符串内容的情况下找到 myFoos 元素的索引。这就是我编写代码的意思:

string toBeSearched = "something";
vector<Foo>::iterator it = find(myFoos.begin(),myFoos.end(),Foo(toBeSearched));
unsigned int index = distance(myFoos.begin(),it);

但我不小心弄乱了 find() 并传递了一个 String 类型的对象而不是 Foo:

find(myFoos.begin(),myFoos.end(),toBeSearched);

然而,一切仍然像我想要的那样工作,为我提供了包含 toBeSearched 字符串的对象的正确位置。这超出了我的理解,这是为什么。当 find() 函数运行时,它需要检查搜索参数和 vector 元素之间的相等性。但是,我没有定义 StringFoo 之间的任何相等关系(我确实编写了 == 运算符的重载来检查两个 Foo)。因此,这样的比较应该是不可能的。我能想到的唯一理论是该函数搜索合适的构造函数并从 String(不正确的数据类型)创建一个 Foo(合适的数据类型) .但是,在我看来,这确实是一种奇怪的行为。此外,我希望像 C++ 这样的静态类型语言在我碰巧像这里传递错误类型的参数时甚至不会首先编译。std::find() 在内部如何处理为实现这一目标而提供的参数?

最佳答案

C++ 允许“用户定义的”隐式转换。

基本上,因为有一个 Foo 构造函数接受一个 string,而您试图使用 string 代替 Foo,它决定通过将 string 传递给 Foo 的构造函数来为您进行转换,该构造函数创建了 Foo 的实例>.

来自 CPPReference :

A user-defined conversion consists of zero or one non-explicit single-argument constructor or non-explicit conversion function call

An expression e is said to be implicitly convertible to T2 if and only if T2 can be copy-initialized from e, that is the declaration T2 t = e; is well-formed (can be compiled), for some invented temporary t. Note that this is different from direct initialization (T2 t(e)), where explicit constructors and conversion functions would additionally be considered.

您可以将 explicit 关键字添加到构造函数以防止它被用于隐式转换。

关于c++ - std::find 是否隐式修复无效参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254746/

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