【发布时间】:2016-01-11 12:08:42
【问题描述】:
以下内容无法编译:
template<void *p>
class X {
// ...
};
int r;
int main()
{
X<&r> x;
return 0;
}
错误信息是
x.cc:10:6: 错误:无法将模板参数‘& r’转换为‘void*’
将 &r 显式转换为 (void *) 也无济于事。错误信息变为:
x.cc:10:14: 错误:无法将模板参数‘(void*)(& r)’转换为‘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) 一起工作,无论是隐式还是显式转换为“无效*”。
它确实与 clang HEAD 3.8.0 (trunk 250513) 一起工作,并且从(至少)clang 3.6.0 (tags/RELEASE_360/ final) 在指定 --std=c++1z 并显式转换为 *void *" 时。 如果没有明确的演员表,clang 会抱怨如下:
x.cc:10:7: 错误:在转换后的常量表达式中不允许从“int *”转换为“void *”
c++ 语言规范中修复这个 bug 的责任是 N4268,clang 已经实现了。
【问题讨论】:
-
我不明白这怎么可能是上述问题的重复。这完全是关于使用“void *”作为模板参数,另一个是关于使用“const char *”作为模板参数。
-
从技术上讲,[temp.param]/p4 禁止使用
void*作为模板非类型参数,尽管我所知道的主要编译器实际上没有强制执行此禁止甚至发出诊断。 -
好的,这很有趣。您指的是哪个文件?
标签: c++ templates gcc standards void