Чи добре сформована наступна програма?
#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 .