在以下示例函式中,f()回傳不完整型別的函式A被標記為已洗掉:
struct A;
A f() = delete;
它被 GCC 接受,但不被 Clang 接受,它抱怨:
error: incomplete result type 'A' in function definition
演示:https : //gcc.godbolt.org/z/937PEz1h3
根據標準,哪個編譯器就在這里?
uj5u.com熱心網友回復:
叮當錯了。
[dcl.fct.def.general]
2函式定義的引數型別或回傳型別不應是函式體內不完整或抽象的(可能是 cv 限定的)型別別,除非該函式被洗掉([dcl.fct.def.delete] )。
我認為這很清楚。洗掉的定義允許不完整的型別別。這不像函式實際上可以在格式良好的程式中呼叫,或者主體實際上以某種方式使用了不完整的型別。該函式是一個占位符,用于表示多載決議的無效結果。
當然,在實際多載決議的情況下引數型別更有趣(并且回傳型別可以是任何型別),但也沒有理由在此處限制回傳型別為完整。
uj5u.com熱心網友回復:
一開始,9.3.4.6 [dcl.fct] 第 9 段要求
函式定義的引數型別或回傳型別不應是不完整的型別別(可能是 cv 限定的),除非函式定義嵌套在該類的成員規范中(包括在類中定義的嵌套類中的定義) )。
提出了缺陷報告,隨后提出并追溯應用了一項決議(強調我的):
型別不應在回傳或引數型別中定義。函式定義的引數型別或回傳型別不應是不完整的型別別(可能是 cv 限定的),除非函式被洗掉(9.5.3 [dcl.fct.def.delete])或定義是嵌套的在該類的成員規范中(包括在類中定義的嵌套類中的定義)。
因此,Clang 是錯誤的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386262.html
上一篇:是否可以在C 20requires子句中初始化模板內部類?
下一篇:如何在mbed中創建執行緒?
