Я обнаружил несоответствие между логикой, созданной gcc-8 и clang-6.
Это произошло в реальной базе кода, когда я разработал с использованием clang, я развернул его с помощью gcc.
Пожалуйста, сообщите, какой компилятор содержит ошибку, чтобы я мог сообщить об ошибке соответствующим образом.
конспект
A
неявно преобразуется в B
A
конструируем как из A
(copy/move), так и из std::initializer_list<B>
.
При инициализации A
из A&&
:
- Clang выбирает Move-конструктор
- gcc выбирает конструктор
initializer_list
.
живая демонстрация: https://coliru.stacked-crooked.com/a/bc50bd8f040d6476
MCVE
#include <initializer_list>
#include <utility>
#include <iostream>
struct thing;
struct thing_ref
{
thing_ref(thing&& other) : ref_(other) {}
thing_ref(thing& other) : ref_(other) {}
thing& ref_;
};
struct thing
{
thing() {}
thing(std::initializer_list<thing_ref> things)
{
std::cout << "initializer_list path\n";
}
thing(thing&& other)
{
std::cout << "move path\n";
}
thing(thing const& other)
{
std::cout << "copy path\n";
}
};
struct foo
{
foo(thing t) : mything { std::move(t) } {}
thing mything;
};
int main()
{
thing t;
auto f = foo { std::move(t) };
}
Настройки компилятора:
Ничего особенного, согласно ссылке coliru: -std=c++17 -O2