c++ - 明确论证?

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

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

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

相关文章:

c++ - 为什么递归 constexpr 模板值不编译?

c++ - 显式复制构造函数

c++ - 使用 fs::recursive_directory_iterator() 和 fs::directory_iterator() 的通用方法

c++ 为什么这个 static_assert 有效 :

wpf - Binding UpdateSourceTrigger=Explicit,在程序启动时更新源

c++ - 在 C++ 中是否可以强制显式向上转换

c++ - 在 constexpr GLenum 数组中存储 OpenGL 颜色附件

c++ - 什么是 Visual Studio 项目引用?

c++ - 为什么我的捕获代码没有被执行?

c++ - gdb 在 Windows 中无法正常工作