在 C++14 中使用自动退货'type'进行显式模板专用化是否有效?



上一个问题。

我重复上一个问题中的代码,使这个问题自成一体。下面的代码编译,如果使用 gcc 4.8.3 编译,则不会发出任何警告。与-std=c++1y.但是,如果使用-std=c++0x标志进行编译,它确实会发出警告。在上一个问题的上下文中,有人指出代码不使用 gcc 4.9.0 进行编译。不幸的是,目前,我并不完全了解auto是如何实施的。因此,如果有人能回答以下问题,我将不胜感激:

1). 以下代码是否C++符合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). 以下代码是否C++符合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 中格式不正确。普通函数(非喇嘛)的返回类型演绎是C++14中引入的一项功能。包含此代码段的程序格式不正确。但是,该标准并未要求实现(编译器)必须拒绝格式错误的程序。它只是在[intro.compliance]/2.2中声明:

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

和/8

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

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

G++

4.8.3 发出警告,该警告计为诊断消息。G++4.9 发出错误,这也是诊断消息。两者都是合规的。通过指定 -Werror ,您可以告诉 g++4.8.3 拒绝此程序。(你必须问gcc开发人员为什么他们把它从警告改为错误。

相关内容

  • 没有找到相关文章

最新更新