簡體   English   中英

鐺,返回帶有類型轉換的std :: unique_ptr

[英]clang, returning std::unique_ptr with type conversion

這是我的代碼:

#include <memory>

struct A{};
struct B: A {};

std::unique_ptr<A> test() 
{
    auto p = std::make_unique<B>();

    return p;
}

int main(int argc, char **argv)
{
    test();

    return 0;
}

它不會在帶有錯誤的clang上編譯:

main.cpp:11:12: error: no viable conversion from returned value of type 'unique_ptr<B, default_delete<B>>' to function return type 'unique_ptr<A, default_delete<A>>'

但是,根據這種情況(相同的情況)應該。 我誤會了嗎?

我的命令行(clang ver 3.7):

clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

這是一個lang蟲。 從[class.copy]:

當滿足復制/移動操作的省略標准,但不滿足異常聲明的標准 ,並且要復制的對象由左值指定時, 或者return語句中的表達式是(可能帶有括號) id-表達名稱帶有自動存儲持續時間的對象在身體或最里面的封閉功能或λ-表達 ,過載分辨率選擇首先執行用於復制的構造的參數聲明子句聲明為如果對象是由一個rvalue指定

省略條件不滿足(因為p與函數的返回類型的類型不同),但是代碼應該仍然有效,因為應該像p是一個右值一樣執行重載解析。

也就是說,您確實希望發生移動省略,因此在這種情況下,最好不要使用auto

std::unique_ptr<A> test() 
{
    std::unique_ptr<A> p = std::unique_ptr<B>();
    return p;
}

clang接受此代碼將發生移動省略。 雙贏。

您需要從unique_ptr中move 以下代碼在CLang和gcc上均進行編譯:

#include <memory>

struct A{};
struct B: A {};

std::unique_ptr<A> test() 
{
    auto p = std::make_unique<B>();

    return std::move(p);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM