range-declaration при range-based for
От: Videoman Россия https://hts.tv/
Дата: 28.11.23 20:31
Оценка:
Следующий код работал в 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 заставить вызваться пользовательское преобразование?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.