explicit
可用于例如构造函数或转换函数,以避免隐式调用该构造函数/转换-简而言之。
[我是否有可能以某种方式使单个参数explicit
感兴趣(缺少处理新类型)?也许使用编译器扩展?
使用引用使得不可能进行复制构造,因此这是一种解决方案,尽管不是我正在寻找的那个。有时可以在功能级别强制使用explicit,这将是一个很好的工具/界面说明符。
explicit
特别是对于字符串,应该使用什么类型来避免从void f(std::string& s); //cannot copy convert into s
void f(const std::string& t);//calling with char* allowed
中构造?
您不能将参数标记为显式,但是您可以做的是添加一个具有右值引用参数的重载,然后像删除它一样
char*
这将允许void f(const std::string& t);
void f(std::string&&) = delete;
接受f
,但是如果由于隐式转换而创建了右值,则将选择右值引用重载,并且会出现关于使用的编译器错误已删除的功能。
之所以可行,是因为右值引用参数在重载解析中击败了对const的引用,因此在传递临时参数时将始终调用它。只有在选择了函数之后,编译器才能看到已删除该函数,从而发出错误。