以下代码无法编译:
template<void *p>
class X {
// ...
};
int r;
int main()
{
X<&r> x;
return 0;
}
错误信息为:
x.cc:10:6: error: could not convert template argument ‘& r’ to ‘void*’
将&r显式地转换为(void *)也没有帮助。错误信息变成了:
x.cc:10:14: error: could not convert template argument ‘(void*)(& r)’ to ‘void*’
标准的哪个部分说明了这种行为?GCC版本为gcc version 5.2.1 20151003 (Ubuntu 5.2.1-21ubuntu2)
编辑:
请注意,使用例如int *而不是void *会按预期工作。
编辑:(回答自己)
指定-std=c++1z时,使用gcc HEAD 6.0.0 20151016 (experimental)无论是隐式还是显式强制转换为"void *"都不能正常工作。 当不进行显式转换时,clang会报出以下错误:
x.cc:10:7: error: conversion from 'int *' to 'void *' is not allowed in a converted constant expression
负责修复C++语言规范中这个漏洞的是N4268,clang已经实现了。
void*
作为模板非类型参数,尽管我所知道的主要编译器都没有执行此禁令,甚至没有发出诊断信息。 - T.C.