explicit 可以用于例如。一个构造函数或转换函数,以避免隐式调用该构造函数/转换 - 简而言之。

我对是否有可能以某种方式进行单个参数 explicit 感兴趣(缺少滚动新类型)?也许使用编译器扩展?

使用引用使复制构造变得不可能,因此这是一种解决方案,尽管不是我正在寻找的解决方案。有时能够在函数级别强制 explicit 将是一种简洁的工具/接口(interface)说明符。

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 接受 std::string ,但如果由于隐式转换而创建了右值,则将选择右值引用重载,并且您将收到有关使用已删除函数的编译器错误。

这样做的原因是右值引用参数在重载解析中优于对 const 的引用,因此在传递临时值时将始终调用它。只有在选择函数后,编译器才会看到它被删除,因此它会发出错误。

关于c++ - 明确论证?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60531823/

10-12 03:11