regular-type

___ qstntxt ___

C ++ 11% %code% Schlüsselwort ist großartig.

Meiner Meinung nach ist ein Typ jedoch Nicht normal (siehe zum Beispiel Was ist ein" Regular Type "im Kontext der Bewegungssemantik? ) die Verwendung von %code% wird schwierig.

Gibt es eine Möglichkeit, die %code% -Deklaration für diesen Typ zu deaktivieren?

Angenommen, eine Klasse %code% emuliert eine Referenz

%Vor%

(im wirklichen Leben wäre es eine kompliziertere Klasse, der wichtige Punkt ist, dass die vorhandene Klasse nicht regelmäßig ist.)

Die einzige Möglichkeit, %code% nicht zu verwenden (einen Kompilierfehler zu geben) besteht darin, die Klasse nicht kopierbar zu machen. Allerdings muss die Klasse einen Kopierkonstruktor haben (mit einer speziellen Semantik, aber einem Kopierkonstruktor).

Gibt es eine Möglichkeit, die Syntax %code% irgendwie zu deaktivieren? wenn %code% nicht regulär ist.

(Noch besser könnte es sein, dem Compiler mitzuteilen, was %code% genau machen soll).

Hinweis: Dies ist kein sehr künstliches Problem, man könnte sehen, dass diese Art von Problem im Kern von %code% liegt (was auch ein Referenzwrapper ist). Das Deaktivieren von (irgendwie) der Syntax %code% würde das Problem von %code% nicht lösen, aber es wird eine schlechte Verwendung schwieriger machen.

Vermisse ich etwas? Sollte ich einen anderen Teil des Designs ändern? Sollten die nicht regulären Klassen eine Typeigenschaft haben, die dem Compiler helfen würde, eine allgemeinere automatische Bestimmung zu ermitteln (z. B. deducce %code% für %code% wo %code% .)

    
___ tag123c11 ___ C ++ 11 ist eine 2011 verabschiedete Version des C ++ - Sprachstandards. Sie hat viele Änderungen und Ergänzungen der Kernsprache sowie der verbesserten und erweiterten C ++ - Standardbibliothek vorgenommen. ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ qstnhdr ___ Gibt es eine Möglichkeit, die automatische Deklaration für nicht reguläre Typen zu deaktivieren? ___ answer40892183 ___

Ein Kopierkonstruktor bedeutet, dass Sie erwarten, dass die Klasse kopiert wird. %code% erstellt eine Kopie von %code% in %code% .

Wenn Sie eine spezielle Kopie wünschen, die nicht automatisch ausgeführt werden soll, können Sie ein Proxy-Objekt verwenden.

%Vor%

Jetzt können wir:

%Vor%

und jetzt muss jeder Versuch, %code% zu kopieren, durch einen Aufruf von %code% ausgeführt werden, und die Verwendung von %code% ist niemals legal, weil nichts einen Kopierkonstruktor hat.

Sie können den Kopierkonstruktor auch als privat definieren und ihn zum Implementieren des %code% -Kopierkonstruktors verwenden.

Beachten Sie, dass die Bedeutung von copy / move ctor durch Elisionsregeln in C ++ eingeschränkt ist.

In C ++ 17 Vorlage Klasse Typ Abzug könnte machen:

%Vor%

Und %code% wäre ein %code% .

    
___ tag123auto ___ Das Schlüsselwort 'auto' wurde in C ++ 11 für einen abgeleiteten Typ wiederverwendet. Wenn sie zum Ersetzen eines Typnamens in einer initialisierten Variablendeklaration verwendet wird, erhält die Variable denselben Typ wie der Initialisierer. Bei der Verwendung als Rückgabetyp wird der Rückgabetyp als abschließender Rückgabetyp angegeben oder aus dem Rücksprungausdruck abgeleitet. ___ tag123regulatype ___ hilf uns dieses Wiki zu bearbeiten ___
1
Antwort

Gibt es eine Möglichkeit, die automatische Deklaration für nicht reguläre Typen zu deaktivieren?

C ++ 11% auto Schlüsselwort ist großartig. Meiner Meinung nach ist ein Typ jedoch Nicht normal (siehe zum Beispiel Was ist ein" Regular Type "im Kontext der Bewegungssemantik? ) die Verwendung von auto wird schwierig. Gibt es eine...
30.11.2016, 12:16