std :: find是否隐式修复了无效参数?

时间:2017-11-12 22:31:37

标签: c++ iterator stdvector

所以我有一个非常奇怪的情况,我的一个程序正在工作,据我所知,没有办法。因此,这个问题只是因为我希望更好地了解我所做的事情的背景(因为我此刻真的很困惑)。

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

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

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

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()函数运行时,需要检查搜索参数和向量元素之间的相等性。但是,我没有定义StringFoo之间的任何相等关系(我确实写了一个==运算符的重载来检查两个Foo&#39;之间的相等性。 S)。因此,这样的比较是不可能的。我能想到的唯一理论是函数搜索合适的构造函数并从Foo创建String(合适的数据类型)(不正确的数据类型)。然而,在我眼里,这将是非常奇怪的行为。另外,当我碰巧在这里传递一个错误类型的参数时,我期望像C ++这样的静态类型语言甚至不能编译。 std::find()内部对它为实现这一目的而提出的论点做了什么?

1 个答案:

答案 0 :(得分:3)

C ++允许&#34;用户定义&#34;隐式转换。

基本上,因为&#39; sa Foo构造函数需要string,并且您尝试使用string代替Foo,它决定通过将string传递给Foo的构造函数来为您进行转换,该构造函数创建了Foo的实例。

来自CPPReference

  

用户定义的转换包含零个或一个非显式单参数构造函数或非显式转换函数调用

     

当且仅当T2可以从e复制初始化时,表达式e被称为可隐式转换为T2,即声明T2 t = e;对于一些发明的临时t来说,形式良好(可以编译)。请注意,这与直接初始化(T2 t(e))不同,后者还将考虑显式构造函数和转换函数。

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

相关问题