Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760

[xvalue][msvs/gcc][bug] member function with ref-qualifier

13.02.2018, 20:40. Показов 1328. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый вечер.


следующий код работает как и ожидается.
и прекрасно компиляется gcc:

http://rextester.com/VASW79342

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
 
struct some
{
    template<class T>
    T&& foo()&& noexcept{ return ::std::move(val); }
    
    template<class T>  operator T&&()&& noexcept
    {
        return std::move(*this).foo<T>();
    }
    
    std::string val = "ololo";
};
 
int main()
{
    some s;
    std::string i = std::move(s);
    std::cout << "'" << i     << "'\n";
    std::cout << "'" << s.val << "'\n";
}

output:
Code
1
2
'ololo'
''
смысл мопеда в том,
что бы задать особую логику геттера для временного объекта.

причем, нужно иметь возможность изнутри дергать за другие
ref-qualifier`s методы.

в общем то все работает чудесно и прекрасно.
в примере видно, что временный объект послушно
позволил себя ограбить.

теперь этот же самый код, только на компиляторах вижуал студии:

http://rextester.com/ZKDT99666

Code
1
2
3
4
5
source_file.cpp(20): error C2440: 'initializing': cannot convert from 'some' to
'std::basic_string<char,std::char_traits<char>,std::allocator<char>>'
source_file.cpp(20): note: No constructor could take the source type, 
or constructor overload resolution was ambiguous
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
что за ...
и как заставить работать студийный компиль?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2018, 20:40
Ответы с готовыми решениями:

GCC/Clang bug
Пытаюсь разбить строку на токены при помощи массива указателей и strtok. Вот рабочий и неправильный вариант, так как присутствует повторное...

Invalid use of member in static member function
Здравствуйте! У меня есть класс: class foo{ public: foo(); ~foo(); int m_number;

C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend
выкидывает C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend при компиляции. что делать?

16
 Аватар для John C Reynolds
3 / 3 / 0
Регистрация: 10.02.2018
Сообщений: 11
13.02.2018, 21:07
Цитата Сообщение от hoggy Посмотреть сообщение
как заставить работать студийный компиль?
Обновить.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.02.2018, 21:12  [ТС]
Цитата Сообщение от John C Reynolds Посмотреть сообщение
Обновить.
найдете что нибудь поновее, чем 19.00.23506,
дайте знать.
0
 Аватар для John C Reynolds
3 / 3 / 0
Регистрация: 10.02.2018
Сообщений: 11
13.02.2018, 21:14
Цитата Сообщение от hoggy Посмотреть сообщение
найдете что нибудь поновее, чем 19.00.23506,
дайте знать.
Нашёл. Даю.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
14.02.2018, 12:07
hoggy, я думаю проблему можно свести к тому, что VC в случае шаблонного оператора преобразования выбирает ф-ю с неверным ref-qualifier.

В случае с operator T
http://rextester.com/JNQRC50672
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string>
 
struct some
{
    template<class T>
    operator T() & noexcept
    {
        std::cout << "&\t" << __FUNCTION__ << std::endl;
        return std::move(val);
    }
    
    template<class T>
    operator T() && noexcept
    {
        std::cout << "&&\t" << __FUNCTION__ << std::endl;
        return std::move(val);
    }
        
    std::string val = "ololo";
};
 
int main()
{
    some s;
    std::string i = std::move(s);
}
почему-то выбирается operator () &.

В случае с operator std::string
http://rextester.com/PJCWYI24748
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
 
struct some
{
    operator std::string() & noexcept
    {
        std::cout << "&\t" << __FUNCTION__ << std::endl;
        return std::move(val);
    }
    
    operator std::string() && noexcept
    {
        std::cout << "&&\t" << __FUNCTION__ << std::endl;
        return std::move(val);
    }
        
    std::string val = "ololo";
};
 
int main()
{
    some s;
    std::string i = std::move(s);
}
выбирается, как и можно ожидать, operator std::string() &&.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.02.2018, 16:41  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
я думаю проблему можно свести к
прежде чем эту тему создавать, я все эти ходы уже исследовал.

мне не нужно сводить проблему к.
мне нужно её как то порешать.

сейчас на препроцессоре разруливается,
если студия - мув оптимизация летит к черту))
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
14.02.2018, 17:15
Костыльный костыль
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
 
#ifdef _MSC_VER
#define DOUBLE_AMPERSAND
#else
#define DOUBLE_AMPERSAND &&
#endif
 
struct some
{
    template<class T>
    T&& foo()&& noexcept{ return ::std::move(val); }
    
    template<class T>  operator T&&() DOUBLE_AMPERSAND noexcept
    {
        return std::move(*this).foo<T>();
    }
    
    std::string val = "ololo";
};
 
int main()
{
    some s;
    std::string i = std::move(s);
    std::cout << "'" << i     << "'\n";
    std::cout << "'" << s.val << "'\n";
}
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
14.02.2018, 21:00
hoggy, move есть возможность как-нибудь подменить (например будет std::string i = my_move(s); вместо std::string i = std::move(s);)? Тогда можно например замисюзать volatile вместо &&, что бы различать rvalue от lvalue )
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.02.2018, 21:34  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
Костыльный костыль
не работает в принципе.

Добавлено через 1 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
есть возможность как-нибудь подменить (например будет std::string i = my_move(s); вместо std::string i = std::move(s)?
есть возможность отписать баг Гейцу Биллу,
и забить на оптимизацию до лучших времен.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
14.02.2018, 21:43
Цитата Сообщение от hoggy Посмотреть сообщение
отписать баг Гейцу Биллу
Думаю, ему пофиг.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.02.2018, 22:30  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Думаю, ему пофиг.
та он чоткий дядька.
сразу бы пистон вставил, и баг бы исправили нашел обходной путь.
в отличии от вас, ниосиляторов...
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
15.02.2018, 00:35
Цитата Сообщение от John C Reynolds Посмотреть сообщение
найдете что нибудь поновее, чем 19.00.23506,
дайте знать.
Все нормально компилится, версия 19.12.25835
0
 Аватар для tmpValue
41 / 75 / 15
Регистрация: 04.10.2017
Сообщений: 283
15.02.2018, 02:00
Цитата Сообщение от hoggy Посмотреть сообщение
в отличии от вас, ниосиляторов
Осилятор - это когда гвозди лобом забивать вместо использовать разум по назнчению. Знаем, проходили.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
15.02.2018, 08:24
Цитата Сообщение от hoggy Посмотреть сообщение
не работает в принципе.
УМВР
0
 Аватар для John C Reynolds
3 / 3 / 0
Регистрация: 10.02.2018
Сообщений: 11
15.02.2018, 11:15
lArtl, зачем ты приписываешь мне чужие слова?
Я-то в курсе, что на 19.10.что-то-там работает.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.02.2018, 12:11  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
УМВР
да так лихо, что мувит lvalue, огаа
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
15.02.2018, 14:07
Цитата Сообщение от John C Reynolds Посмотреть сообщение
lArtl, зачем ты приписываешь мне чужие слова?
Цитировал из поста, не обратил внимание
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2018, 14:07
Помогаю со студенческими работами здесь

Cannot access protected member via a qualifier of type
Добрый вечер, джентльмены. Столкнулся с проблемой при наследовании, не могу понять причину возникновения. Прошу вашего совета, или...

Class member function to std::function
Всем привет. Вопрос: почему 43 строка не работает? #include &lt;functional&gt; #include &lt;iostream&gt; template &lt;typename C,...

Функции-члены с "ref-qualifier"
Собственно, компилируя с помощью g++ 4.8.1 следующий код #include &lt;iostream&gt; #include &lt;type_traits&gt; int main() { ...

A property, indexer or dynamic member access may not be passed as an out or ref parameter
ошибка : A property, indexer or dynamic member access may not be passed as an out or ref parameter код : Date obj = new Date(); ...

GCC flexible array member
Добрый день. Уважаемые форумчане, подскажите мне непутевому одну должно быть простую вещь. Как в GCC (MinGW) без особых извращений...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru