С Новым годом! Форум программистов, компьютерный форум, киберфорум
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. Показов 1308. Ответов 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru