gpt4 book ai didi

c++ - 调用了错误类型的显式构造函数

转载 作者:可可西里 更新时间:2023-11-01 18:29:10 25 4
gpt4 key购买 nike

在下面的示例中,我的输出是“single param ctor”,两次。我的问题有两个,首先,为什么调用 bool ctor 而不是包含字符串的版本,其次,有没有办法在不转换调用的情况下获取调用的字符串版本?

顺便说一句,我的实际代码不会使用硬编码字符串调用构造函数,而是使用类似的东西:

static constexpr auto NONE = "NONE";
Foo aFoo(NONE);

...

#include <iostream>
#include <string>

using namespace std;


struct Foo {

explicit Foo(bool _isVisible = false): id(""), isVisible(_isVisible) {cout << "single param ctor" << endl;}
explicit Foo(const string _id, bool _isVisible = false): id(_id), isVisible(_isVisible) {cout << "multip param ctor" << endl;}

const string id;
bool isVisible;
};

int main(int argc, const char * argv[]) {

shared_ptr<Foo> sharedFoo = make_shared<Foo>("hello");
Foo regFoo("hi");
return 0;
}

最佳答案

这是 C++ 的局限性,它继承自旧版 C++,并最终继承自 C。

您的字符串文字转换为 bool 比转换为“用户定义”类型 std::string 更好。

您可以添加一个采用 const char* 的构造函数,而不是在调用中强制转换,可能让它委托(delegate)给您现有的采用 std::string 的构造函数:

explicit Foo(const char* _id, bool _isVisible = false)
: Foo(std::string(_id), _isVisible)
{};

这个构造函数将是一个“精确匹配”(或者足够接近)并防止 bool 抢尽风头。

或者,从 C++14 开始,使用 the std::string literal 代替强制转换,例如“嗨”,尽管您必须记住在调用站点执行此操作,这对于一般解决方案来说有点“meh”。

顺便说一句,如果你真的想按值获取你的std::string _id参数,不要让它成为const ;您正在阻止它从成员初始化程序中移动并需要一个拷贝。根据您的典型调用站点发生的情况,以下内容可能更有意义:

explicit Foo(
string _id,
bool _isVisible = false
)
: id(std::move(_id))
, isVisible(_isVisible)
{}

不过,如果您通常传入一个左值,至少要接受一个 const std::string& 以防止出现一次复制。

关于c++ - 调用了错误类型的显式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39598993/

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