使参数明确?

问题描述 投票:1回答:1

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

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

使用引用使得不可能进行复制构造,因此这是一种解决方案,尽管不是我正在寻找的那个。有时可以在功能级别强制使用,这将是一个很好的工具/界面说明符。

explicit

特别是对于字符串,应该使用什么类型来避免从void f(std::string& s); //cannot copy convert into s void f(const std::string& t);//calling with char* allowed 中构造?

c++ c++17 explicit
1个回答
5
投票

您不能将参数标记为显式,但是您可以做的是添加一个具有右值引用参数的重载,然后像删除它一样

char*

这将允许void f(const std::string& t); void f(std::string&&) = delete; 接受f,但是如果由于隐式转换而创建了右值,则将选择右值引用重载,并且会出现关于使用的编译器错误已删除的功能。

之所以可行,是因为右值引用参数在重载解析中击败了对const的引用,因此在传递临时参数时将始终调用它。只有在选择了函数之后,编译器才能看到已删除该函数,从而发出错误。

© www.soinside.com 2019 - 2024. All rights reserved.