template<typename T>
struct S
{
template<auto = T()>
void f();
};
int main()
{
S<int> a; // ok
S<int&> b; // error
S<int()> c; // gcc ok, clang error
}
error: cannot create object of function type 'int ()'
这有道理。由于gcc确实用int&
诊断实例化,所以我怀疑这是一个gcc bug。是这样吗?还是这段代码不需要诊断?
这是CWG1635:
1635年。模板默认参数与函数默认参数有多相似?
默认函数参数仅在需要时实例化。默认模板参数也是这样吗?例如,下面的格式是否良好?
#include <type_traits>
template<class T>
struct X {
template<class U = typename T::type>
static void foo(int){}
static void foo(...){}
};
int main(){
X<std::enable_if<false>>::foo(0);
}
struct S {
template<typename T = U> void f();
struct U {};
};
如果允许我执行以下操作: 为什么我主要不被允许做以下事情? 但我必须具体说明以下几点: C11引入了默认的模板参数,现在我完全无法理解它们。
这几乎可以肯定是gcc错误的一个重复,在非类型模板参数中不诊断缩小转换吗?但它并没有提供令人满意的答案。答案并没有说明GCC不提供诊断是否错误,只是给出了一个在某种程度上可以替代的警告标志。 本标准的相关章节: §14.3.2/5 对于整数或枚举类型的非类型模板参数,应用转换常量表达式(5.19)中允许的转换。 §5.19/3 类型T的转换常量表达式是一个字面常量表达式,隐式转换为类型T,其中字面
是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错
是否允许在友元声明中为模板参数提供默认值? Visual Studio 2015似乎允许这样做。gcc拒绝了。我在cppreference页面上找不到任何内容。
我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译
已编辑(原始问题只有int A,int B): 模板参数推断在两个专门化之间比较的#参数相同时按预期工作,但在它们不同时失败(因为在其中一个专门化中包含默认参数)。 例如:为什么模板参数推导在一种情况下与另一种情况下失败,有人能指出解释这一点的任何资源/标准吗? 错误:模糊模板实例化'类Foo