首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回函数中的unique_ptr<Derived>,该函数声明为返回unique_ptr<Base>

返回函数中的unique_ptr<Derived>,该函数声明为返回unique_ptr<Base>
EN

Stack Overflow用户
提问于 2020-04-18 12:08:10
回答 2查看 101关注 0票数 1

代码返回一个unique_ptr<Derived> in函数,该函数被声明为返回unique_ptr<Base>。当用g++-4.8编译时,我得到一个错误,而用g++-5.4和g++-7编译时没有错误。这是g++4.8的编译器错误,还是我做错了什么?

守则:

代码语言:javascript
复制
#include <memory>

class Base
{
public:
    Base() {}
};

class Derived: public Base
{
public:
    Derived() : Base() {}
};

std::unique_ptr<Base> func()
{
    std::unique_ptr<Derived> derivedPtr = std::unique_ptr<Derived>();
    return derivedPtr;
}

int main()
{
    std::unique_ptr<Base> basePtr = func();

    return 0;
}

G++-4.8的错误:

代码语言:javascript
复制
$ g++-4.8 -std=c++11 test.cpp
test.cpp: In function ?std::unique_ptr<Base> func()?:
test.cpp:19:9: error: cannot bind ?std::unique_ptr<Derived>? lvalue to ?std::unique_ptr<Derived>&&?
  return derivedPtr;
         ^
In file included from /usr/include/c++/4.8/memory:81:0,
                 from test.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:169:2: error:   initializing argument 1 of ?std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Up, _Ep>&&) [with _Up = Derived; _Ep = std::default_delete<Derived>; <template-parameter-2-3> = void; _Tp = Base; _Dp = std::default_delete<Base>]?
  unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept

  ^

G++-7没有错误:

代码语言:javascript
复制
$ g++-7 -std=c++11 test.cpp
$ 

如果我将func更改为return std::move(derivedPtr);,那么代码将在所有g++版本上编译。虽然我想了解我的原始代码是否有效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-18 12:46:57

is CWG 1579追溯地应用于C++11,但旧的编译器版本可能会忽略这一点。

票数 1
EN

Stack Overflow用户

发布于 2020-04-18 12:22:46

从编译器特性的gcc的身份文件中可以看出,C++11特性是在gcc版本4.3到4.8.1之间实现的。

事实上,status页面声明:

GCC 4.8.1是2011年C++标准(前称C++0x )的第一个完整实现。

不幸的是,标准库实现没有那么方便的页面,但可以肯定的是,库中特性的实现与编译器本身的语言特性的实现大致相同。

因此,完全合理的是,4.8版标准库的版本不完整,就像编译器没有完成一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61288827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档