当前位置: 首页 > 知识库问答 >
问题:

对于默认模板参数格式不正确的未使用成员模板是否需要诊断?

湛钊
2023-03-14
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。是这样吗?还是这段代码不需要诊断?

共有1个答案

郦楷
2023-03-14

这是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