Следующий
код работал в VS2017 и перестал работать в последних VS2022, gcc и clang:
#include <array>
#include <string>
#include <optional>
#include <iostream>
#include <memory>
namespace com
{
template<typename interface_t>
class ptr
{
public:
ptr(interface_t* ptr = nullptr) noexcept { m_ptr = ptr; }
operator interface_t*() const noexcept { return m_ptr; }
private:
interface_t* m_ptr;
};
}
class pin
{
public:
pin(int* v) {};
};
int main()
{
std::array<com::ptr<int>, 10> arr_of_ptr;
for (pin p : arr_of_ptr) // error: no viable conversion from 'value_type'
{
}
pin p1(arr_of_ptr[0]); // ок: case 1
pin p2 = arr_of_ptr[0]; // error: case 2
}
У меня догадка такая, что раньше VS генерировал case1, а теперь по стандарту должен case2, т.е. разные виды инициализации. Вопросы:
1. Прав ли я и теперь по стандарту возможен лишь второй вариант?
2. Можно ли как-то в таком range-for заставить вызваться пользовательское преобразование?