2015-11-29 34 views
8

mam do czynienia z naprawdę dziwny komunikat o błędzie w Visual Studio 2015. Poniżej okrojona kodu:„Domyślny konstruktor nie można odwoływać się” w Visual Studio 2015

struct A 
{ 
    A(int val = 0) 
    : 
     x(val) 
    {} 

    int x = 0; 
}; 

struct B: A 
{ 
    static int y; 
}; 

int B::y = 1; 

struct C: B 
{ 

}; 

int main() 
{ 
    C c; 
    return 0; 
} 

kompiluje bez problemu na Clang. Jednakże Visual Studio 2015 IntelliSense daje następujący komunikat o błędzie:

the default constructor of "C" cannot be referenced -- it is a deleted function 

jestem brakuje czegoś w moim kodu, czy jest to błąd w Visual Studio?


UPDATE

oparciu o komentarzach i odpowiedziach tu otworzyły bug report na Microsoft Connect.

+3

Kompiluje jednak, prawda?Nie martwiłbym się o błędy IntelliSense. Czasami się gubi i błędnie zgłasza problemy. –

+1

To jest błąd w (Intellisense in) Visual Studio. Wszystkie błędy Visual Studio są prawdziwe. AFAIK. Intellisense nie używa tej samej maszyny analitycznej co kompilator. Może się to jednak zmienić w przyszłości. –

+0

Czuję, że widzimy kilka błędów Intellisense na tydzień. –

Odpowiedz

7

To jest błąd Intellisense. Zarówno clang, jak i gcc akceptują ten kod, także webcompiler an online Visual c++ compiler accepts this code.

Projekt C++ 14 część standardowa 12.1[class.ctor] mówi defaulted domyślnego konstruktora dla klasy zostanie usunięty, jeśli:

  • X jest klasą unia-tak ma element wariantowy z nietrywialnym konstruktorem domyślnym, dowolny niestatyczny element danych bez inicjatora typu klamrowego lub równorzędnego jest typu odniesienia,
  • dowolny nie-wariantowy niestatyczny element danych typu const-qualified (lub ich tablica) bez nawiasu klamrowego -orequal- inicjujący nie posiada konstruktora domyślnego użytkownika, pod warunkiem,
  • X jest związkiem a wszyscy jej członkowie są z wariantów const wykwalifikowanych typu (lub jego tablicy),
  • X jest non-union klasa a wszystkie elementy dowolnego anonimowego członu złączonego są typu const-kwalifikowanego (lub ich tablicy), każdy potencjalnie skonstruowany obiekt podrzędny, z wyjątkiem niestatycznego elementu danych z klamrami lub równorzędnymi, ma klasę M (lub array ) i albo M nie ma konstruktora domyślnego, albo przeciążenie Rozdzielczość (13.3) zastosowana do domyślnego konstruktora M powoduje niejednoznaczność w postaci lub w funkcji, która jest usunięta lub niedostępna od domyślny konstruktor domyślny lub
  • każdy potencjalnie skonstruowany podobiekt ma typ z destruktorem, który jest usunięty lub niedostępny z domyślnego domyślnego konstruktora .

nie ma tu zastosowania.

Aktualizacja

W bug report filed by the OP odpowiedź była:

Dziękujemy za zgłoszenie tego problemu. Poprawka powinna być dostępna w następnej aktualizacji do programu Visual Studio 2015.

+0

Czy wiesz, czy 'cl' (rzeczywisty kompilator C++ używany przez Visual Studio) akceptuje kod? Jest to nieco bardziej istotne dla użytkownika VS niż gcc i clang. –

+1

@BenVoigt [webcompiler akceptuje kod] (http://webcompiler.cloudapp.net/) niestety nie mogę utworzyć linku na żywo. Szkoda, że ​​nie dodali go, a cała reszta pozwoli ci tworzyć linki na żywo i jest to przydatna funkcja. –

+0

Nie można znaleźć przyczyny, dla której program Visual Studio był zdenerwowany, ale zadeklarowałem prywatnych członków danych jako Const. Przeniesienie pól Const do zakresu globalnego rozwiązało problem – Luminaire

Powiązane problemy