Trong ví dụ sau, đầu ra của tôi là "ctor param duy nhất", hai lần. Câu hỏi của tôi là gấp đôi, đầu tiên, tại sao là bool ctor được gọi là thay vì phiên bản có chứa chuỗi, và thứ hai, là có một cách để có được phiên bản chuỗi được gọi mà không cần gọi các cuộc gọi?constructor rõ ràng của loại sai gọi là
Là một sang một bên, mã thực tế của tôi không gọi các nhà thầu với chuỗi mã hóa cứng nhưng với một cái gì đó như:
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;
}
nên không vô nghĩa như mong muốn này tiềm ẩn * string-đen * để * bool * chuyển đổi có ưu tiên cao hơn không được chấp nhận trong C + +? – WhiZTiM
@WhiZTiM: 'nullptr' được giới thiệu để trợ giúp trong một số trường hợp nhưng, trừ khi chúng ta thay đổi loại chuỗi ký tự, hoặc loại bỏ mảng-tên-phân rã, hoặc thay đổi cách con trỏ hoạt động, chúng ta đang mắc kẹt với nó. Vì vậy, ''foo' s' sau đó được giới thiệu để cung cấp cho chúng ta các chuỗi ký tự không chống lại vấn đề .. nhưng điều đó chỉ hữu ích khi bạn đã biết được vấn đề! Và nếu bạn đang có, sau đó nó tương đối dễ dàng giải quyết tại nguồn anyway (như được hiển thị ở trên). –
@WhiZTiM: BTW từ bạn đang tìm kiếm là "không được chấp nhận". –