簡體   English   中英

用戶提供的構造函數與顯式默認的構造函數

[英]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() { }

DEMO

工作正常,但以下情況:

struct X
{
};

struct Y
{
    X&& x; 
    Y(Y const&);
};

Y::Y(Y const&)= default; //error

int main() { }

DEMO

[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.

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