Private struct mit using zugänglich machen
-
hi!
Ist es normal, dass man das machen kann (VS2013)? Findet ihr das problematisch?
class Test { struct Test2 { ; }; }; //using TTest2 = Test::Test2; // inaccessible template<class> using TTest2 = Test::Test2; int main() { //Test::Test2 test2; // inaccessible TTest2<int> test2; // OK }
-
Also sowohl der MSVC als auch Ideone schlucken das.
-
Ich denke kaum, dass das erwünscht ist. Dass die Zugriffsspezifizierer so umgangen werden, ist in der Tat problematisch.
Es dürfte sich um Compilerbugs oder evtl. sogar Fehler/unzureichende Spezifikation im Standard handeln.
-
Das wird wohl ein Compiler-Fehler sein, in MSVC, Clang und GCC - für Aliastemplates ist etwas derartiges definitiv nicht vorgesehen.
Fehler/unzureichende Spezifikation im Standard handeln.
Unmöglich. Siehe
Access control is applied uniformly to all names, whether the names are referred to from declarations or expressions.
[ Note: Access control applies to names nominated by friend declarations (11.3) and using-declarations (7.3.3). — end note ]Offensichtlich fällt die Deklaration eines Aliastemplates unter diese Beschreibung, demnach sollte das wie erwartet ill-formed sein.
Der Bug-Report ist abgesandt.Das einzige, was mich stört, ist, dass gleich die drei interessantesten Compiler das schlucken, GCC, Clang und VC++...
-
Arcoth schrieb:
Das einzige, was mich stört, ist, dass gleich die drei interessantesten Compiler das schlucken, GCC, Clang und VC++...
Hat jemand nen Intel Compiler zur Hand, der das mal kurz testet?
-
Skym0sh0 schrieb:
Arcoth schrieb:
Das einzige, was mich stört, ist, dass gleich die drei interessantesten Compiler das schlucken, GCC, Clang und VC++...
Hat jemand nen Intel Compiler zur Hand, der das mal kurz testet?
Ich nicht, aber godbolt:
http://goo.gl/yNC97E
[url]http://gcc.godbolt.org/#{"version"%3A3%2C"filterAsm"%3A{"labels"%3Atrue%2C"directives"%3Atrue%2C"intel"%3Atrue}%2C"compilers"%3A[{"sourcez"%3A"FAYwNghgzlAECCwDewCQUAuAnAriDsAQrEgL4DcwFwwGApgLYAOk9APONFAHzA5QBLAHYBzWAGFYAXgQAuWYXKwA9MoRgsdCABMAnrAwALOrG11OWCBgEB7IbBsAzA4YFwIYAdAOMWVk26wAmBgALSONlgMdNo0wgQMEMIAFACUyGjibPDcsCAAjJSoWfG5IABMlKRAA"%2C"compiler"%3A"%2Fopt%2Fintel%2Fbin%2Ficc"%2C"options"%3A"-O3 -std%3Dc%2B%2B0x"}]}[/url]
-
allowed for cfront compatibility
Was heißt denn das? Cfront ist doch schon ewig her?
-
-
-
Das würde zumindest erklären, warum sich hier alle Compiler konsistent verhalten.
Allerdings gehe ich stark davon aus, dass der Standard entsprechend korrigiert wird, dann wären unsere Bugreports doch gerechtfertigt
(Davon abgesehen, dass ich als Compilerschreiber Unklarheiten so auslegen würde, dass die dem erwarteten Verhalten entsprechen)
-
Ist eigentlich
template<class> struct TTest3 { typedef Test::Test2 type; };
erlaubt? g++ und icc lassen es durch, clang nicht.
-
erlaubt?
Natürlich nicht.