Здравствуйте, andrey.desman, Вы писали:
BFE>>Придумал задачку. AD>А в чем предполагается засада?
Полагаю, в копировании x, несмотря на возврат по ссылке. С другой стороны, этой фиче сто лет в обед, даром, что в структурное связывание завёрнута в данном примере.
Здравствуйте, flаt, Вы писали:
BFE>>>Придумал задачку. AD>>А в чем предполагается засада? F>Полагаю, в копировании x, несмотря на возврат по ссылке. С другой стороны, этой фиче сто лет в обед, даром, что в структурное связывание завёрнута в данном примере.
Здравствуйте, flаt, Вы писали:
F>Полагаю, в копировании x, несмотря на возврат по ссылке. С другой стороны, этой фиче сто лет в обед, даром, что в структурное связывание завёрнута в данном примере.
Т.е. фишка в том, что кто-то или даже многие подумают, что будет создан lvalue копией значения? Потому что auto без &&.
Здравствуйте, B0FEE664, Вы писали:
BFE>auto x = ...; // => x не ссылка BFE>[x](){ /* x — не ссылка */ };
Да.
BFE>auto [x] = ...; // x — может ссылка, может нет
Никогда не ссылка. Синоним. Или что-то я упустил. (массивы).
BFE>Всё лоГично!
Почти)
Здравствуйте, andrey.desman, Вы писали:
BFE>>auto [x] = ...; // x — может ссылка, может нет AD>Никогда не ссылка. Синоним. Или что-то я упустил. (массивы).
Что за "Синоним"?
Выглядит как ссылка, ведёт себя как ссылка:
#include <type_traits>
#include <iostream>
#include <functional>
#include <mutex>
int main()
{
int a = 1;
int b = 2;
std::pair<int&, int&> ab{a,b};
auto [a_, b_] = ab;
a_ += 8;
std::cout << "a=" << a << std::endl;
std::cout << std::boolalpha;
std::cout << "std::is_same<int&, decltype(a_)>::value = " << std::is_same<int&, decltype(a_)>::value << std::endl;
return 0;
}
Здравствуйте, B0FEE664, Вы писали:
AD>>Никогда не ссылка. Синоним. Или что-то я упустил. (массивы). BFE>Что за "Синоним"?
Примерно как #define
BFE>Выглядит как ссылка, ведёт себя как ссылка.
Но не ссылка
BFE>Так что программа-то напечатает?
3
Здравствуйте, B0FEE664, Вы писали:
BFE>Придумал задачку. BFE>Что выведет следующая программа:
Интересный приёмчик, может быть, даже потянет на идиому.
Но — в чём подвох?
Функция возвращает структуру со ссылочным типом внутри.
Прямой доступ — Ref().second — оперирует со ссылкой, тут ничего непредсказуемого нет.
Структурное связывание — делает теневую копию этой структуры и ссылки на её поля, очень грубо говоря,
auto [lock, x] = ts.Ref();
auto copy = ts.Ref();
auto& lock = copy.first;
auto& x = copy.second;
ссылка на ссылку равна ссылке.
И тоже никаких сюрпризов.
BFE>>Given the type Ti designated by std::tuple_element<i, E>::type
BFE>>- так это и есть ссылка для std::pair<int&, int&> AD>Для самой пары значение.
В каком смысле?
AD> Тут можно поговорить на тему guaranteed copy elision. AD>Да,еще упустил tuple-like классы, но смысл не меняется. Для них ссылки, но это по сути это то же кроме поддержки битовых полей.
Ну как же не меняется?
Вот тут:
int a = 1;
int b = 2;
std::pair<int&, int&> ab{a,b};
auto [a_, b_] = ab;
a_ += 8;
a_ — это ссылка int& b_ — это ссылка int&
Согласно приведённой σ ссылке на стандарт, a_ привязывается к скрытой переменной r1 тип которой int&& или int&&& (-> int&) и которая ссылается на поле скрытой переменной e, а вот e — это копия структуры ab типа std::pair<int&, int&>.
Здравствуйте, B0FEE664, Вы писали:
BFE>Придумал задачку. BFE>Что выведет следующая программа:
Фигню какую-нибудь.
А в чем вообще ценность таких задачек? Когда тебе 18, то кажется, что код надо писать, проходя по грани человеческих познаний в области языка программирования. С опытом приходит понимание, что код надо писать так, чтобы любой юниор его прочел и правильно понял. И это гораздо сложнее, на самом деле.
А что выведет именно эта програмка — ну, можно запустить и посмотреть...
Здравствуйте, B0FEE664, Вы писали:
AD>>Для самой пары значение. BFE>В каком смысле?
В смысле копии пары.
AD>>Да,еще упустил tuple-like классы, но смысл не меняется. Для них ссылки, но это по сути это то же кроме поддержки битовых полей. BFE>Ну как же не меняется?
Так и не меняется.
BFE>Согласно приведённой σ ссылке на стандарт, BFE>a_ привязывается к скрытой переменной r1 тип которой int&& или int&&& (-> int&) и которая ссылается на поле скрытой переменной e, а вот e — это копия структуры ab типа std::pair<int&, int&>.
Здравствуйте, Кодт, Вы писали: К>Интересный приёмчик, может быть, даже потянет на идиому.
Это развитие вот такого подхода.
template<typename T>
class SafeData
{
public:
...
T Get()
{
std::lock_guard<std::mutex> lock(mtx);
return data;
}
void Set(const T& value)
{
std::lock_guard<std::mutex> lock(mtx);
data = value;
}
template<class Fn>
auto Access(Fn&& fnAccess)
{
std::lock_guard<std::mutex> lock( mtx );
return const_access(std::forward<Fn>(fnAccess));
}
template<class Fn>
auto Transform(Fn&& op)
{
std::lock_guard<std::mutex> lock( mtx );
return op(data);
}
private:
std::mutex mtx;
T data;
};
В редких случаях есть желание получить опасный прямой доступ к data не через Access/Transform, а напрямую. Сначала я написал LockGuard друзей SafeData, а потом подумал, что можно обойтись парой функций:
К>Функция возвращает структуру со ссылочным типом внутри. К>Прямой доступ — Ref().second — оперирует со ссылкой, тут ничего непредсказуемого нет. К>Структурное связывание — делает теневую копию этой структуры и ссылки на её поля, очень грубо говоря, К>
Здравствуйте, Pzz, Вы писали:
BFE>>Придумал задачку. BFE>>Что выведет следующая программа: Pzz>Фигню какую-нибудь.
Да — не, ровно то, что должно, без подвохов.
Pzz>А в чем вообще ценность таких задачек?
Вот, думаю в продакшен добавить...
Pzz>Когда тебе 18, то кажется, что код надо писать, проходя по грани человеческих познаний в области языка программирования. Pzz> С опытом приходит понимание, что код надо писать так, чтобы любой юниор его прочел и правильно понял. И это гораздо сложнее, на самом деле.
Некое противоречие есть в ваших словах.
Или юниор младше 18, либо ему будет интересно читать такой код.
Pzz>А что выведет именно эта програмка — ну, можно запустить и посмотреть...
Это вам не Паскаль.
Здравствуйте, B0FEE664, Вы писали:
Pzz>> С опытом приходит понимание, что код надо писать так, чтобы любой юниор его прочел и правильно понял. И это гораздо сложнее, на самом деле. BFE>Некое противоречие есть в ваших словах. BFE>Или юниор младше 18, либо ему будет интересно читать такой код.
Никакого противоречия нет. Мы пишем код, чтобы решить задачу, а не чтобы блеснуть своими познаниями тонкостей языка. И потом этот код будет кто-то поддерживать. Чем он проще и яснее, тем проще его поддерживать и разбираться с проблемами, в нем или по соседству.
Pzz>>А что выведет именно эта програмка — ну, можно запустить и посмотреть... BFE>Это вам не Паскаль.
А что, C++ дошел уже до того, что программы на нем и запустить стало невозможно?