本文介绍了为什么我不能在传递给参数时隐式构造一个给定合适的构造函数的对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下面的例子中,为什么我不能简单地传递 string 到 printFoo()?

  #include< string> 
#include< iostream>

using namespace std;

class Foo {
public:
Foo(const Foo& foo):str(foo.str){}
Foo(string str):str str){}

string str;
};

void printFoo(Foo foo){
cout<< foo.str< endl;
}

int main(){
Foo foo(qux);
printFoo(foo); // OK

printFoo(qix); //错误:没有匹配函数调用'printFoo'

return 0;
}

无论出于什么原因,我在我脑海中自动确定了构造函数



为什么我不能这样做,但我可以传递 char [n]

解决方案常量到接受 std :: string / div>

会涉及两个隐式转换:


  1. 到 std :: string

  2. 至 Foo

C ++最多只能有一个:



4次标准转换(N3337)

(强调我的)


In the below example, why can't I simply pass a string to the printFoo()?

#include <string>
#include <iostream>

using namespace std;

class Foo {
public:
  Foo(const Foo &foo) : str(foo.str) {}
  Foo(string str) : str(str) {}

  string str;
};

void printFoo(Foo foo) {
  cout << foo.str << endl;
}

int main() {
  Foo foo("qux");
  printFoo(foo); // OK

  printFoo("qix"); // error: no matching function for call to 'printFoo'

  return 0;
}

For whatever reason, I had in my head that a constructor would automatically be determined and used in order to construct an object.

Why can't I do this, but I can pass a char[n] constant to an argument accepting a std::string, for example?

解决方案

There would be two implicit conversions involved:

  1. to std::string
  2. to Foo

C++ does at most one:

From 4 Standard conversions (N3337)

Also 12.3 Conversions (N3337)

(Emphasis mine)

这篇关于为什么我不能在传递给参数时隐式构造一个给定合适的构造函数的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 20:01