Size: a a a

2021 July 08

V

Valerie in pro.cxx
Всем здравствуйте! Подскажите, возможно ли на Windows 10 загрузить во время исполнения приложения shell extension dll в windows explorer? Как это сделать вручную я знаю, сейчас это делается во время установки и в результате перезагружается сам Explorer. А есть ли способ сделать это при выполнении условия (добавления аккаунта, например) в коде приложения? Если что, приложение написано на Qt, extension с использованием ATL скомпилировано в отдельную dll. Спасибо
источник

E

Estonavt in pro.cxx
Привет, у меня вопрос по std::move и rvalue/lvalue и правилом склейки ссылок:

1) функция принимает T&&, то есть универсальную ссылку

например:
template<class T>
void foo(T&& var) {var = 2;}

правильно ли я понял:

* lvalue всегда останется lvalue (по правилу склейки) и останется ссылочным типом, что очень логично.

* rvalue (или же lvalue засунутое в  std::move и закасченое к rvalue) будет по правилу склейки T&&, но в итоге тип T&& будет интерпретироваться как чистый тип T (что как раз меня путает).

2) Если это верно, то я очень сильно удивлен механизмом - что мы кастим lvalue к rvalue через std::move (то есть делаем из него T&&), которая потом интерпритируется как чистый тип T

Пример:
template<class T>
void foo(T&& var) {var = 2;}

int a = 5;
foo(a);
// a = 2 -> что логично так как 'a' становится int& var.
a = 5; // сделали снова отличным от 2.
foo(std::move(a));
// a = 2 снова, но внутри foo  'a' a обрабатывается не как int&& var, а как чистый тип 'int var', но при этом изменение все равно затрагивает 'a' вне функции foo.
источник

ES

Egor Suvorov in pro.cxx
Нет. Работает так:

1. Сначала вывели T либо в чистый тип U, либо в U&. Это как раз правила вывода для universal reference. Тут склейки типов ещё нет.
2. Дальше, чтобы узнать тип аргумента, подставили в T&& и получили либо U&& (rvalue-ссылка), либо (U&)&& = U& (lvalue-ссылка). Тут как раз идёт reference collapsing.
источник

DP

Denis Paukaev in pro.cxx
но внутри foo  'a' a обрабатывается не как int&& var, а как чистый тип 'int var', это не верно
источник

ES

Egor Suvorov in pro.cxx
То есть тип аргумента — это всегда какая-то ссылка, либо lvalue, либо rvalue. И автовывод для forwarding reference подогнан таким образом, чтобы ссылка там была правильная.
источник

ES

Egor Suvorov in pro.cxx
Так что в примере выше так:
int a = 5;
foo(a);  // a -- lvalue, поэтому T=int&, T&&=int&, то есть var -- lvalue-ссылка на a. Изменили var -- изменилась a.
a = 5; // вернули
foo(std::move(a));  // a -- rvalue, поэтому T=int, T&&=int&&, то есть var -- rvalue-ссылка на a. Изменили var -- изменилась a.
источник

E

Estonavt in pro.cxx
@yeputons @dpaukaev понял, большое спасибо!
источник
2021 July 09

オレンジ in pro.cxx
Привет всем, есть такое: https://godbolt.org/z/eEY1noczx
Можно ли как-то доработать шаблонную функцию так, чтобы принимала оба итератора (константные и неконстантные)? При этом только итераторы для LR::geometry::Point. C++14
источник

オレンジ in pro.cxx
Есть ощущение что возможно можно как-нибудь применить std::decay_t
источник

ES

Egor Suvorov in pro.cxx
Можно просто заменить template<typename...> class Iterator на typename Iterator.

Если прям очень хочется что-то проверять, то скормить внутрь Iterator другой шаблонный тип и при помощи SFINAE/концептов проверить, что если у него отбросить const, то получится что надо
источник

オレンジ in pro.cxx
Если заменить на typename Iterator, то неоткуда взять T для result_of_t, да и итератор теперь может быть на любой контейнер
источник

ES

Egor Suvorov in pro.cxx
Для первого наверняка есть трейты, в крайнем случае — decltype
источник

D

Dmitriy in pro.cxx
MSVC не прав?
источник

D

Dmitriy in pro.cxx
источник

D

Dmitriy in pro.cxx
Как можно исправить?
источник

DP

Denis Paukaev in pro.cxx
обновиться на версию повыше?
источник

D

Dmitriy in pro.cxx
Увы, история небыстрая
Пока обошелся явной подстановкой fold-expr в enable_if_t
источник

DP

Denis Paukaev in pro.cxx
источник

D

Dmitriy in pro.cxx
Ага, как вариант. Спасибо!
источник

K

Kelbon in pro.cxx
в stl есть хоть одна consteval функция на данный момент? Вроде хотят рефлексию вводить(получение данных внутреннего представления компилятора), очевидно такие функции обязаны быть consteval(не будешь же вызывать компилятор на рантайме), может для этого и ввели этот квалификатор?
источник