Dies ist nicht das erste Mal, dass ich sehe, dass ein Konstrukt von einigen Compilern akzeptiert und von anderen abgelehnt wird. Welcher Compiler falsch ist, ist nicht immer offensichtlich. Ich vermute, dass clang falsch ist und gcc/msvc richtig sind, aber ich möchte die Meinung von C++-Experten einholen, bevor ich einen Fehler an llvm melde.
Quellcode:
Code: Select all
#include
class A {
public:
class B {
public:
int i = 0;
B() = default;
};
std::optional b {};
A() {
b.emplace();
}
};
Code: Select all
$ clang -std=c++20 -o opt_clang.o -c opt.cpp
opt.cpp:14:11: error: no matching member function for call to 'emplace'
14 | b.emplace();
| ~~^~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/optional:1116:2: note: candidate template ignored: requirement 'is_constructible_v' was not satisfied [with _Args = ]
1116 | emplace(_Args&&... __args)
| ^
/usr/lib/gcc/x86_64-linux-gnu/15/../../../../include/c++/15/optional:1128:2: note: candidate function template not viable: requires at least argument '__il', but no arguments were provided
1128 | emplace(initializer_list __il, _Args&&... __args)
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
- Die Klasse B muss in A verschachtelt sein. Kein Fehler, wenn die Klasse B außerhalb von A liegt.
- Das Feld A::B::i muss vorhanden sein. Kein Fehler, wenn das Feld entfernt wird.
- Der B()-Konstruktor darf keinen Parameter haben. Wenn es einen Parameter gibt, z.B. B(int), dann wird b.emplace(1) akzeptiert.
Code: Select all
$ clang --version
Ubuntu clang version 20.1.8 (0ubuntu4)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-20/bin
Mobile version