![](/img/trans.png)
[英]A defaulted default constructor, why is it not a user-provided default constructor?
[英]User-provided constructor vs explicitly defaulted one
N4296::12.8/11 [class.copy]
告訴我們以下內容:
如果X具有以下功能,則默認將類X的默認復制/移動構造函數定義為已刪除(8.4.3):
[...]
(11.2)—無法復制/移動的可能構造的子對象類型M(或其數組),因為應用於M的相應構造函數的重載分辨率(13.3)導致歧義或函數從默認值中刪除或不可訪問構造函數
[...]
因此尚不清楚為什么該程序
struct X
{
};
struct Y
{
X&& x;
Y(Y const&)= default;
};
int main() { }
工作正常,但以下情況:
struct X
{
};
struct Y
{
X&& x;
Y(Y const&);
};
Y::Y(Y const&)= default; //error
int main() { }
[dcl.fct.def.default] / p5,重點是:
如果函數是由用戶聲明的,並且未在其第一個聲明中顯式默認或刪除,則由用戶提供 。 用戶提供的顯式默認函數(即,在其第一次聲明后顯式默認)在顯式默認的點定義; 如果將此類函數隱式定義為Delete,則程序格式錯誤 。
這是有道理的,因為對刪除函數的任何使用都會使程序格式錯誤,但是使用用戶提供的顯式默認函數,可能無法在調用站點進行診斷:
// y.h
struct X
{
};
struct Y
{
X&& x;
Y(Y const&);
};
// y.cpp
#include "y.h"
Y::Y(Y const&)= default; //defined as deleted
// main.cpp
#include "y.h"
int main() {
Y y = Y();
}
編譯main.cpp
,編譯器除了存在Y
以外, main.cpp
Y
的副本構造函數; 它不知道它是默認值,也無法診斷它實際上已被刪除。 可以診斷出此類錯誤的唯一位置是明確指定該功能的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.