Konnte nicht-statische Member-Variable im consExpr-Konstruktor (C ++ 14) geändert werden?

9
%Vor%
  • URL des Online-Compilers: Ссылка
  • Compiler: clang 3.4 (mit -std = c ++ 1y)
  • System: Linux 3.2

Wenn ich L2 lösche, kompiliert dieser Code. Wenn ich L2 hinzufüge, beschwerte sich der Compiler "Modifikation des Objekts von Const-qualifiziertem Typ 'const int' ist in einem konstanten Ausdruck nicht erlaubt". Ich bin kein Sprachanwalt, also bin ich mir nicht sicher, ob das stimmt. Wenn das der Fall ist, warum hat der Compiler nichts über L1 geklagt, da er auch A () als conexpr bezeichnet? Ist das ein Klirren? Oder habe ich etwas vermisst?

Referenz: Ссылка

BTW, wenn ich "conexpr A a" ändere; zu "A a" (Schlüsselwort conexpr löschen), L1 konnte nicht kompiliert werden, was erwartet wird. Der Compiler hat sich jedoch nicht mehr über L2 beschweren.

URL des Online-Compilers dazu: Ссылка

    
ytj 14.05.2014, 06:47
quelle

1 Antwort

4

Ich glaube, dies ist nur ein Fall von Compilern, die die für C ++ 14 vorgeschlagenen Änderungen nicht umgesetzt haben. Ihr Konstruktor constexpr erfüllt alle in §7.1.5 / 4 von N3936 . Sowohl gcc und clang können Ihren Code nicht kompilieren , sondern aus verschiedenen Gründen.

klingelt klagt:

  

Hinweis: Änderung des Objekts vom Const-qualifizierten Typ 'const int' ist in einem konstanten Ausdruck nicht erlaubt

was nicht viel Sinn macht, aber erinnert mich an die C ++ 11 Einschränkung, die constexpr -Member Funktionen sind implizit const (das ist ein Konstruktor, und das gilt nicht, aber die Fehlermeldung ist erinnert daran). Diese Einschränkung wurde auch für C ++ 14 aufgehoben.

gcc's Fehlermeldung ist:

  

Fehler: consExpr Konstruktor hat keinen leeren Körper

Es scheint ziemlich klar zu sein, dass gcc immer noch die C ++ 11 Regeln für constexpr Konstruktoren implementiert.

Darüber hinaus listet N3597 dieses Beispiel auf:

%Vor%

N3597 wurde durch N3652 ersetzt, das den Wortlaut des aktuellen Entwurfs enthält. Leider verschwindet das frühere Beispiel, aber nichts in der aktuellen Formulierung besagt, dass Sie Datenelementen im Rumpf eines constexpr -Konstruktors keine Werte zuweisen können.

Update (2017-10-03)

clang hat das behoben, aber es wurde noch keine neue Version veröffentlicht: Ссылка ( Compiler-Explorer )

    
Praetorian 14.05.2014, 07:58
quelle

Tags und Links