2017-05-05 8 views
-1

Kürzlich programmiert i accidently folgend:Ist es möglich, eine Funktion aufzurufen, die einen konstanten Wert als Parameter annimmt?

void someFunction(const SomeClass&& value){ 
    //Some Code 
} 

Ich meine nicht das 'const' Schlüsselwort auf den Wert Parameter hinzuzufügen. Das hat mich jedoch zum Nachdenken gebracht: Ist es überhaupt möglich, diese Funktion zu nennen, , wenn eine äquivalente Funktion ohne const existiert? Wenn ja, macht das jemals einen Sinn und gibt es einen praktischen Nutzen?

+0

http://www.codesynthesis.com/~boris/blog/2012/07/24/const-rvalue-references/. "Genauer gesagt, wird ein const rvalue es vorziehen, an die const rvalue-Referenz und nicht an die const lvalue-Referenz zu binden." Aber, Sie sollten sich nicht mit Const rvalues ​​beschäftigen. Sie ergeben nicht viel Sinn. – mutex36

Antwort

2

Dieser Code:

#include <iostream> 
using namespace std; 

struct s{};  

void someFunction(s& value){ std::cout << "ref" << std::endl; } 

void someFunction(const s&& value){ std::cout << "const" << std::endl; } 

void someFunction(s&& value){ std::cout << "non const" << std::endl; } 

const s foo() { return s(); } 
s bar() { return s(); } 


int main() { 
    someFunction(bar()); 
    someFunction(foo()); 
    return 0; 
} 

Prints

non const 
const 

Für eine Erklärung (die ich nicht zur Verfügung stellen kann;) Ich verweise Sie auf this site. Das wichtigste Zitat ist:

[...] Dies macht Const rvalue Referenzen ziemlich nutzlos. Denken Sie darüber nach: Wenn alles, was wir brauchen, eine nicht veränderbare Referenz auf ein Objekt ist (rvalue oder lvalue), dann macht eine const lvalue-Referenz die Aufgabe perfekt. Die einzige Situation, in der wir Rvalues ​​aussortieren wollen, ist, wenn wir sie verschieben wollen. Und in diesem Fall brauchen wir eine modifizierbare Referenz.

Der einzige Anwendungsfall ich mich vorstellen könnte ist someFunction zu verwenden, um festzustellen, ob eine zweite Funktion ein const oder ein nicht const zurückkommt, aber ich denke, es gibt einfachere Wege, das herauszufinden.

Als Nebenbemerkung: Wenn Sie s mit int in obigem Code ersetzen it prints:

non const 
non const 

und das ist, weil (aus dem gleichen Ort zu zitieren, Kommentar von Pizer):

Es gibt keine konstanten Werte von Skalartypen. Für einen konstanten Wert benötigen Sie entweder ein Xvalue- und/oder ein Klassen-Objekt. [...]

+0

Siehe den Kommentar in dem verknüpften Artikel für weitere Informationen darüber, warum mit "Int" die non-const-Überladung verwendet wird: * "Es gibt keine konstanten Werte von Skalartypen. Für einen konstanten Wert benötigen Sie entweder einen Xvalue und/oder Ich bin mir fast sicher, dass ein kompilierender Compiler f (g()) genau wie f (1) in Bezug auf die Überladungsauflösung behandelt, da g nur einen Wert und kein Objekt zurückgibt. "* – clcto

+0

@clcto Danke für die Klarstellung – user463035818

Verwandte Themen