我可以在编译时强制执行永不调用该函数的方法吗?

时间:2019-02-19 12:56:20

标签: c++

我想防止从std::stringstd::filesystem::pathboost::filesystem::path的隐式转换。

据我所知,没有办法修改系统头文件以使构造函数明确。

因此,我认为我将创建一个内部api函数的替代,以接受std::string而不是fileystem::path并在内部调用assert(false)

但是后来我开始怀疑编译器是否应该知道是否曾经引用过给定的函数声明,因此假设它可以在编译时而不是运行时检测对此类覆盖的调用,并警告或失败编译。

我的想法正确吗?有什么方法可以防止在编译时调用此类函数?

最好, 皮奥特

1 个答案:

答案 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
}

(demo)