簡體   English   中英

對不完整類型使用 std::function 是否有效?

[英]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返回類型的名稱

來自std::function的文檔

function class 模板提供了多態包裝器,概括了 function 指針的概念。 包裝器可以存儲、復制和調用任意可調用對象,給定一個調用簽名,允許函數成為一流的對象。

上面的意思是模板參數應該是調用簽名的形式。 來自呼叫簽名的文檔

調用簽名是返回類型的名稱,后跟用括號括起來的逗號分隔的零個或多個參數類型列表。

(強調我的)

正如我們所見,上面要求S是返回類型的名稱。 也就是說,它沒有明確要求S是完整的。

換句話說,您給出的示例中的S滿足此條件,因此它是有效的。

暫無
暫無

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

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