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

在C 14中使用自动返回“type”进行显式模板专门化是否有效?

云默
2023-03-14

上一个问题。

我重复上一个问题的代码,使这个问题变得独立。如果使用gcc 4.8.3编译以下代码,则不会发出任何警告。带有-std=c1y。但是,如果使用-std=c0x标志编译,它会发出警告。在上一个问题的上下文中,有人指出,代码不是使用gcc 4.9.0编译的。不幸的是,目前我并不完全理解auto是如何实现的。因此,如果有人能回答以下问题,我将不胜感激:

1). 就C 14标准而言,以下代码是否有效?

2). 如果是的话,这个代码会被认为是一个好的风格吗?如果没有,为什么没有?

3)。为什么下面的代码在使用C 11编译器时编译和工作(有时)?或者,为什么它不总是工作?是否有任何特定的标志/选项/设置可以阻止它工作?

template<int N> auto getOutputPort2();
template<> auto getOutputPort2<0>();
template<> auto getOutputPort2<1>();

template<>
auto getOutputPort2<0>()
{
    return std::unique_ptr<int>(new int(10));
}

template<>
auto getOutputPort2<1>()
{
    return std::unique_ptr<string>(new string("qwerty"));
}

共有1个答案

仲君昊
2023-03-14

1). 就C 14标准而言,以下代码是否有效?

是的,据我所知。这有时有点难以证明,因为通常没有什么东西能阻止它。然而,我们可以看看最近的草案(N4296之后)中的一个例子,[dcl.spec.auto]/13:

template <typename T> auto g(T t) { return t; } // #1
template auto g(int);                           // OK, return type is int
template char g(char);                          // error, no matching template
template<> auto g(double);                      // OK, forward declaration with
                                                // unknown return type

同一段规定:

使用占位符类型的声明返回类型的函数或函数模板的重新声明或特化也应使用该占位符,而不是推导类型。

因此,函数模板的显式专门化必须使用返回类型推断。我找不到任何东西禁止不同专业的不同退货类型。类似地,在C 98中,通过使返回类型依赖于模板参数,可以实现函数模板专门化(同一主模板)的不同返回类型。通过使用元编程,基本上可以实现与使用返回类型推断为不同的专门化指定不相关的返回类型时相同的效果。

3). 为什么下面的代码似乎使用C 11编译器编译和工作(有时)?

OP中的代码在C 11中格式错误。普通函数(非lamdas)的返回类型推导是C 14中引入的一项功能。包含此代码片段的程序格式错误。但是,标准并未强制实现(编译器)必须拒绝格式错误的程序。它仅在[intro.compliance]/2.2中声明:

如果程序包含违反任何可诊断规则[...],符合要求的实现应发出至少一条诊断消息。

8月份

符合标准的实现可以具有扩展(包括附加的库函数),前提是它们不会改变任何格式良好的程序的行为。根据本国际标准,需要实现来诊断使用此类扩展的程序是否格式错误。但是,这样做后,他们可以编译和执行此类程序。

(因此,实现可以接受此程序作为扩展。)

g 4.8.3发出警告,作为诊断信息。G4.9发出错误,这也是一条诊断信息。两者都是顺从的。通过指定-Werror,您可以告诉G4.8.3拒绝该程序。(你必须问问gcc开发人员,他们为什么将警告改为错误。)

 类似资料:
  • 考虑代码: 我用不同的编译器(通过编译器资源管理器)测试了代码。 如果Clang 7.0.0编译,而给出错误: :8:20:错误:没有与函数模板专用化“栏”匹配的函数模板 :7:26:注意:已忽略候选模板:无法将'void()'与'int()'匹配 Visual C同意(MSVC 19 2017 RTW): (8) :错误C2912:显式专门化“int Test::bar(void)”不是函数模板

  • 在本文中,他们说(c)是(b)的显式专门化。我的疑问是,为什么我们不能说它是(a)的显式专门化?因为我们可以为任何特定类型专门化模板。所以,当专门化int*时,为什么他们说(c)显式专门化(b)。 任何评论都将有助于理解事情。

  • 我有一些代码使用两种不同类型的颜色,每个通道8位和每个通道16位,每个都由一个结构表示。为了有效地重用我的代码,我有一个模板函数可以对它们进行一些渲染。因此,我希望有一个模板函数来获取我的颜色通道的最大值。 我最初的尝试是这样的。我只展示了8 bpc的专业化 这不会在Visual studio 2012中编译。我明白了 1个 对我来说,我觉得这应该行得通,但我一直找不到任何例子。在Speciali

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。

  • 例1 如前所述,上面的编译和链接没有问题。然而,在实际应用程序中,我有许多函数模板和许多枚举成员。因此,我试图通过将成员分组到一个新类中来使我的生活变得更轻松,这个类本身依赖于模板参数,并为每个枚举值显式地实例化该类。 例2 编辑:用户2B-T通过https://www.onlinegdb.com/hygr7w0fv_提供了这些示例,供人们进行实验。