[英]Is it valid to use std::function with incomplete types?
我想知道使用不完整類型的std::function
是否有效,例如在前向聲明的情況下。 我寫了這個小代碼:
#include <iostream>
#include <functional>
struct S;
std::function<S(void)> m;
struct S {
S() { std::cout << "ctor\n"; }
~S() { std::cout << "dtor\n"; }
void foo() { std::cout << "foo\n";}
};
S goo() {
return S{};
}
int main() {
m = goo;
m().foo();
}
即使S
在聲明m
時不完整,我也可以將返回類型聲明為完整類型(非指針返回類型)。 此代碼符合要求並正常工作,但我不確定此代碼是否符合標准。 因為如果返回類型不是普通函數中的指針,則不能轉發聲明返回類型(所以我不能轉發聲明goo()
的S
)。
知道這是否是標准的有效代碼嗎?
知道這是否是標准的有效代碼嗎?
該程序是良構的,因為即使在定義std::function<S(void)> m;
時S
是不完整的; , std::function
不要求S
是一個完整類型,而是要求S
是返回類型的名稱。
function class 模板提供了多態包裝器,概括了 function 指針的概念。 包裝器可以存儲、復制和調用任意可調用對象,給定一個調用簽名,允許函數成為一流的對象。
上面的意思是模板參數應該是調用簽名的形式。 來自呼叫簽名的文檔:
調用簽名是返回類型的名稱,后跟用括號括起來的逗號分隔的零個或多個參數類型列表。
(強調我的)
正如我們所見,上面要求S
是返回類型的名稱。 也就是說,它沒有明確要求S
是完整的。
換句話說,您給出的示例中的S
滿足此條件,因此它是有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.