g ++ - 如何禁用从0到指针类型的隐式转换?

Hri*_*nev 3 c++ g++

具体来说,我希望以下代码失败:

void a(void*){}
int main(){
    a(0); // FAIL
    a(NULL); // FAIL
    a(nullptr); // success
}
Run Code Online (Sandbox Code Playgroud)

我想要编译以下代码:

void a(int){}
void a(void*){}
int main(){
    a(0); // calls first a
    a(NULL); // calls first a; that's why I have -Werror
    a(nullptr); // calls second a
}
Run Code Online (Sandbox Code Playgroud)

以下代码目前无法编译,但应根据我的规则:

void a(std::size_t){}
void a(void*){}
int main(){
    a(0); // two candidates
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何让g ++表现得那样?

chr*_*ris 5

-Wzero-as-null-pointer-constant当您使用0或NULL代替时,您可以编译以获取警告nullptr.为了促进错误,我相信使用-Werror=zero-as-null-pointer-constant会起作用.

不幸的是,这只是一个警告,无法更改重载决策规则.我还认为NULL必须定义为0而不是nullptr为了使警告能够捕获它,但至少从GCC 4.9开始,std::is_null_pointer<decltype(NULL)>::value false GCC在使用时发出警告NULL.