簡體   English   中英

為什么 extern 模板實例化不適用於僅移動類型?

[英]Why does extern template instantiation not work on move-only types?

下面的代碼沒問題:

#include <memory>
#include <vector>

extern template class std::vector<int>;
template class std::vector<int>; // ok on copyable types

int main()
{
    [[maybe_unused]] auto v1 = std::vector<int>{}; // ok
    [[maybe_unused]] auto v2 = std::vector<std::unique_ptr<int>>{}; // ok   
}

但是,以下編譯失敗:

#include <memory>
#include <vector>

extern template class std::vector<std::unique_ptr<int>>;
template class std::vector<std::unique_ptr<int>>; // error on move-only types

int main()
{
    [[maybe_unused]] auto v1 = std::vector<int>{};
    [[maybe_unused]] auto v2 = std::vector<std::unique_ptr<int>>{};    
}

參見: https://godbolt.org/z/8qe94oGx5

為什么 extern 模板實例化不適用於僅移動類型?

顯式實例化定義(又名template class... )將實例化所有成員函數(本身沒有模板化)。

除其他外,它將嘗試實例化向量的復制構造函數(以及其他需要可復制性的函數),並且由於顯而易見的原因而失敗。

可以使用requires來防止它,但std::vector不使用它。

暫無
暫無

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

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