<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/106346>106346</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
std::optional as a member variable of a parent class, cause std::is_constructible_v to fail.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Marc-Pierre-Barbier
</td>
</tr>
</table>
<pre>
Hello,
while trying to migrate one of my apps to clang i discovered the following issue.
i have a class A contained within class B. class A has a std::optional<B> as a member value.
class B contains a double that i want initialise to 0. the simples option is to use =0 or {} instead of writing a constructor. but when i do that combined with the std::optional<B> any usage of std::optional<B>::emplace(not limited to the member variable) will fail to compile. This is because B is no longer constructible according to `is_constructible_v` but it still according to `is_default_constructible_v`. The weirdest part ? commenting out std::optional<B> will allow the code to compile alternatively defining a default contructor in B that do the initialisation of the double will also fix it.
Tested with the following code using clang 17(using gcc10)
```C++
#include <optional>
class A {
public:
class B {
public:
//removing the {} will fix the compilation
double example{};
};
//alternatively commenting this will fix the compilation
std::optional<B> transmission{};
};
int main(int argc, char ** argv) {
using test = A::B;
static_assert(std::is_constructible<test>::value == true);
static_assert(std::is_default_constructible_v<A::B>);
static_assert(std::is_constructible_v<test>);
std::optional<test> a;
//emplace use std::is_constructible_v
a.emplace();
return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVU2P4jgQ_TXmUmoUnAaSQw5AD9rLSnuY-6iSFKRWjo3sCkz_-5Wd8DXdvbOLopA4ro_36lUZQ-CjJarUcquWbzMcpHO--hN98_IXk_f0skVfM_lZ7dr36g8yxim9U9mbyjbj_dKxIRD_zvYI4qDno0chcJbAHaB_BzydQvzSGLRHYGg5NO5MnlqQjuDgjHGXaM0hDDR_dM7Q4ZkAo20IsIHGWUG21MKFpWM7fdjO4balwwAIQVqVb1S-cSdhZ9GofLdV-TdIX3vqa_JwRnMLODm6Roi7WjfUEVuHAgwXtAJsWRgNB4qIsnlCELg_GQowhgJOaIdAoPK3DJwHtd6q9RuwDULYRlouniVCxhgviB8acX4O9SBw6chGltwYuHF9fQM8hvsSmn2HIeAxEf_VrnGR-pPBhpQurBMw3LPEcrgU4MaOZ6wNKV3ChY2BA7JJhXT9iQ3N4XvHIcKtqcGIdxtfrAPj7JH8HRpHGrFpnG8nlahVxuHH04YfZ7XKIFHAAkFixE9sWjrgYOQT25gPwYXYtxQETugFVL6P6fZkE91ukK_pSxgxijGx0LiWHtACGiFvUfhM5h1aOrAdKzhllJQzFhLYwnYsXztSetMNJom4Q1qdBDYFDg4O_BNYnlrgOwV5rP69XVKCQ0iPqbUWa6WLceHYNItM6XLytMrGa6f0Nl7jqs7ZNmZoo1B3dza-PYa_dlWUcFo4DbXhJjKYXgGunbe974FPNsWf0nul9556d0417ejaGqO--OfEfGQ8MTXZT0TRT4ydNtqofHv3_uE9RXou2YMOJAr3NzEBvpaKeLSh5xDi9udsnp7HIWYFemSrdBEf0R8bpXfQdOhB6Y3Sm7h2jm12Y1Bl5VhIiVJW-Rtsxky2D87LICjc_MAQyIvSxS3fX3tL5bvo6Nb-afBFt9Gz-CH2-H91_FUD5rt7it_-h7-Pfq6pPvl4vJefFWayAnwMPOpgmnZpJv9b6KsVzu_z8RcknmTwFrKnej832ayt8rbMS5xRtVjr1yLPF8vVrKsKarOyXK50Wa_LnMoSy6IoMl1Qvj6saDHjSmf6NSt0kRWLcrGa14tDow8F4lIvm6wo1GtGPbKZG3Pu584fZ-nMrBbZKn9dzQzWZEI6zbW2dBlPVKV1PNx9FY1e6uEY1GtmOEi4uxEWQ9UHWn85LcfzIE4vjOOVrIy9n-SMv2E3ztJ4gsxngzdVJ3IKcWsq0JGlG-p543ql9zGp6e_l5N3f1IjS-wQlKL2fsJ4r_U8AAAD__xzFyu8">