如何为参数中的隐式类型转换定义构造函数?

时间:2019-12-30 08:50:16

标签: c++

最近我在<filesystem>中使用函数,例如std::filesystem::exists。这些函数接受std::filesystem::path。我注意到将const char*之类的"/abc"传递给std::filesystem::exists之类的功能,例如std::filesystem::exists("/abc")

我的问题是,似乎在将const char*传递到std::filesystem::exists时,我们正在进行从const char*filesystem::path的隐式转换。

  1. 哪个构造函数在filesystem::path类上处理此问题?
  2. 如何为这种类型的转换编写构造函数?下面的代码似乎不起作用,并且我不确定出什么问题。 (我对C ++有点陌生了。)
class A {
  A(const char*& msg) {
    std::cout << msg << std::endl;
  }
};

void func(const A& p) {
}

int main(int argc, const char * argv[]) {
  func("123"); // No matching function for call to 'func'
  return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,将构造函数设为Public。

其次,代码中A的构造函数采用const char*&引用了const char*,因此const char*不会隐式转换为A因为const char*&是左值引用,而const char*是右值(基本上是无名的临时值)

尝试一下,它将起作用

#include<iostream>
class A {
public:
  A(const char* msg) {
    std::cout << msg << std::endl;
  }
};

void func(const A& p) {
}

int main(int argc, const char * argv[]) {
  func("123"); // No matching function for call to 'func'
  return 0;
}
  

哪个构造函数在filesystem :: path类上处理此问题

根据cppreference,(5)构造函数

template< class Source > path( const Source& source, format fmt = auto_format );

负责从const char*std::filesystem::path的隐式类型转换