下面的代碼沒問題:
#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 模板實體化不適用于僅移動型別?
uj5u.com熱心網友回復:
顯式實體化定義(又名template class ...)將實體化所有成員函式(它們本身沒有被模板化)。
除其他外,它會嘗試為向量(以及其他需要可復制性的函式)實體化復制建構式,但由于顯而易見的原因,它會失敗。
可以用 來防止requires,但std::vector不使用它。有趣的是,requires在這種情況下,Clang 忽略了,所以我報告了一個 bug。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380296.html
