C++ std::optional::emplace() von clang abgelehnt, von gcc und msvc akzeptiertC++

Programme in C++. Entwicklerforum
Anonymous
 C++ std::optional::emplace() von clang abgelehnt, von gcc und msvc akzeptiert

Post by Anonymous »

Der folgende C++-Code kann mit clang 20 nicht kompiliert werden, während er mit gcc und msvc kompiliert wird.
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();
}
};
Kompilierungsfehler:

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.
Bedingungen zur Reproduktion des Problems:
  • 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.
Compiler-Version:

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post