Чи добре сформована наступна програма?
#include <vector>
struct A {
explicit A(int) {}
};
int main() {
std::vector<int> vi = {1, 2, 3, 4, 5};
std::vector<A> va(vi.begin(), vi.end());
}
Відповідно до C ++ 17 [послідовності.рекмтс], вимога до
X u(i, j);
де X
контейнер послідовності, це:
T
повинні бутиEmplaceConstructible
вX
с*i
.
Однак у попередньому пункті зазначено, що:
i
іj
позначають ітератори, що задовольняють вимогам ітератора вхідних даних і посилаються на елементи, неявно перетворювані наvalue_type
,
Таким чином, мені здається, що обидві вимоги повинні бути дотримані: тип значення діапазону повинен бути неявно перетворюється на тип значення контейнера і EmplaceConstructible
повинен бути задоволений (а це означає, що алокатор повинен бути в змозі виконати необхідну ініціалізацію) . Оскільки int
вона не піддається неявному перетворенню A
, ця програма має бути неправильно сформованою.
Однак, як не дивно, схоже , вона складається в рамках GCC .