It seems that clang is not working properly with std::experimental::optional.
Consider the following example:
#include <experimental/optional>
#include <iostream>
struct Foo { int bar; };
int main() {
Foo foo;
std::experimental::optional<Foo> opt = foo;
opt.value().bar = 42;
std::cout << opt.value().bar << std::endl;
}
It compiles fine with g ++ version 5.3.1, but it is not associated with either clang version 7.0.0 or clang version 7.0.2.
Error returned:
Undefined symbols for architecture x86_64:
"std::experimental::bad_optional_access::~bad_optional_access()", referenced from:
_main in main-11b2dd.o
"typeinfo for std::experimental::bad_optional_access", referenced from:
_main in main-11b2dd.o
"vtable for std::experimental::bad_optional_access", referenced from:
std::experimental::bad_optional_access::bad_optional_access() in main-11b2dd.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I could not find the problem open in the error report for clang.
Who is behaving right? I think g ++ works fine, and clang seems to be listening. I'm wrong?
EDIT1
Actually, the error seems to be related to the definition bad_optional_access, although the problem occurs when using clang.
EDIT2
, -std=c++14.
, clang osx, ( optional ), value.
, :
opt->bar
:
opt.value().bar