Warum schließt CTAD S (nicht s ) ab und erlaubt auto s2 = s {"hi"};?C++

Programme in C++. Entwicklerforum
Anonymous
 Warum schließt CTAD S (nicht s ) ab und erlaubt auto s2 = s {"hi"};?

Post by Anonymous »

Ich untersuche das Argumentabzug der Klassenvorlagen (CTAD) für ein Aggregat mit einem Array -Element, wenn er aus einem String -Literal initialisiert wurde. < /p>

Code: Select all

#include 
#include 

template 
struct S {
T t[3];
/*
aggregate deduction candidate:
template
S F(const T(&)[3]);
*/
};

int main() {
auto s1 = S{{"hi"}};   // I expected decltype(s1) == S
static_assert(std::is_same_v);  // passes

auto s2 = S{"hi"};     // I expected this to be a compilation error

auto s3 = S{"hi"};    // OK: prints "hi"
auto s4 = S{{"hi"}};  // OK: prints "hi"
}
< /code>
Zitate aus cppreference.com < /p>

Lassen Sie E  i < /sub> das (möglicherweise rekursive) Aggregatelement sein, das aus Arg. T  1 , t  2 ,…, t  n  des Kandidaten des Aggregatsabzugs wie folgt: 

Wenn e  i  ein Array ist und ein Sub> -Regal ist. Deklarierte Art von e  i < /sub>. wörtlich 


[b] Was ich erwartet hatte, [/b] 

[*]  für s1: 
E₁ ist t 
(Typ t [3]. "Hi" .
Nach dem zweiten Zitat sollte T₁ konstant sein. Arg₁ ist ein String-buchstäblicher Streicher, Klammer-Elision sollte nicht zugelassen werden, daher erwartete ich, dass auto s2 = s {"hi"}; schlecht geformt werden.

Code: Select all

s1
zieht S .

ab

Code: Select all

s2
ohne Fehler kompiliert und auch S . zum C ++ - Standard?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post