作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在下面的示例中,我的输出是“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/
我是一名优秀的程序员,十分优秀!