【发布时间】:2015-02-22 03:41:09
【问题描述】:
我重复上一个问题的代码以使这个问题独立。如果使用 gcc 4.8.3 编译下面的代码,它不会发出任何警告。与-std=c++1y。但是,如果使用-std=c++0x 标志编译,它会发出警告。在上一个问题的上下文中,有人说代码不能使用 gcc 4.9.0 编译。不幸的是,目前我还没有完全理解auto是如何实现的。因此,如果有人能回答以下问题,我将不胜感激:
1)。就 C++14 标准而言,下面的代码是有效的 C++ 吗?
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"));
}
【问题讨论】:
-
参见 [dcl.spec.auto]/13 “具有使用占位符类型的已声明返回类型的函数或函数模板的重新声明或特化也应使用该占位符,而不是推导类型。”
-
对我来说,使用 auto 似乎很好。使用 int 值来打开同一函数的不同含义看起来很可疑。
-
“如果是,这段代码会被认为是一个好的样式吗?如果不是,为什么不呢?” 对于这部分问题,我建议你在@上提问987654322@
-
“工作(有时)”是什么意思?
-
@frasnian 恐怕这是对我之前问题的引用(请参阅本问题开头的链接之一)。使用 c++11 时,代码不使用 gcc 4.9 编译,而是编译(带有警告)并按预期使用 gcc 4.8.3 运行。
标签: c++ c++11 auto c++14 explicit-specialization