我想防止从std::string
到std::filesystem::path
或boost::filesystem::path
的隐式转换。
据我所知,没有办法修改系统头文件以使构造函数明确。
因此,我认为我将创建一个内部api函数的替代,以接受std::string
而不是fileystem::path
并在内部调用assert(false)
。
但是后来我开始怀疑编译器是否应该知道是否曾经引用过给定的函数声明,因此假设它可以在编译时而不是运行时检测对此类覆盖的调用,并警告或失败编译。
我的想法正确吗?有什么方法可以防止在编译时调用此类函数?
最好, 皮奥特
答案 0 :(得分:12)
您可以声明但不能定义转换。更好的是,您可以将函数声明为Deleted。如果曾经调用过,则在编译时会出错。
void f(std::filesystem::path p)
{
// ...
}
void f(std::string) = delete; // explanation
#include <iostream>
struct path
{
path(std::string) {} // OOPS, not explicit!
};
void f(path p)
{
std::cout << "f(path)\n";
}
void f(std::string) = delete;
int main(int argc, char** argv)
{
std::string s = "/dev/null";
//f(s); // error: use of deleted function 'void f(std::__cxx11::string)'
f(path{s}); // OK
}