Вопросы по теме 'argument-dependent-lookup'

Каковы подводные камни ADL?
Некоторое время назад я прочитал статью, в которой объяснялись некоторые ловушки поиска, зависящего от аргумента, но я больше не могу ее найти. Речь шла о получении доступа к вещам, к которым у вас не должно быть доступа, или что-то в этом роде....
4878 просмотров

C++ ADL во вложенных пространствах имен с функцией шаблона
У меня вопрос относительно стандартного разрешения ADL в C++. Вот пример кода, объясняющий мой запрос: #include <string> // The mechanism: namespace A { template< class C > ::std::string scope(const C*) { return "A"; }...
834 просмотров

ADL без шаблонов
Можно ли показать мне пример ADL без использования шаблонов? Никогда не видел ничего подобного. Я имею в виду что-то вроде здесь . В частности, меня интересует пример, в котором это приводит к какой-то ловушке, как в упомянутом выше. ИЗМЕНИТЬ:...
230 просмотров

Поиск в зависимости от аргумента в базе класса шаблона
У меня есть класс-шаблон NB::B<T> , производный от класса-шаблона NA::A в пространстве имен. act<T> — это функция шаблона, вызывающая функцию add_ref для экземпляра своего аргумента шаблона. В частности,...
713 просмотров

Почему ADL имеет приоритет над функцией в пространстве имен std, но приравнивается к функции в пространстве имен, определяемом пользователем?
У меня есть два фрагмента для ADL в демонстрационных целях. Оба фрагмента были скомпилированы компиляторами VC10, gcc и comeau C ++, и результат одинаков для всех трех. ‹1> ADL против использования директивы пользовательского пространства имен:...
1300 просмотров

Обычный неквалифицированный поиск и поиск по имени в зависимости от аргумента (ADL)
Для неквалифицированного поиска имени, «Обычного неполного поиска» и «Поиска имени, зависящего от аргумента» (ADL), я не могу найти в стандарте, какой из них происходит первым? Опять же, поскольку оба пытаются добавить что-то в набор кандидатов на...
127 просмотров

Разве ADL не ищет статические функции-члены?
Это дополнительный вопрос от Поиск только по аргументам пространства имен или классы тоже? , в котором @David Rodríguez сказал: «ADL будет искать во включающем пространстве имен типа, а также внутри самого типа». Возможно, я ошибся в том, что он...
517 просмотров
schedule 26.10.2022

Бьярн ошибается насчет этого примера ADL, или у меня есть ошибка компилятора?
Я читаю Язык программирования C ++, 4-е издание (от Бьярна Страуструпа ) о аргумент-зависимый-поиск . Вот цитата (26.3.6, Сверхагрессивный ADL): Поиск, зависящий от аргументов (часто называемый ADL), очень полезен, чтобы избежать...
3469 просмотров
schedule 17.05.2022

Почему при двухэтапном поиске не выбирается перегруженная версия swap?
Я изучаю этот увлекательный ответ на тонкий вопрос относительно наилучшей практики реализации swap функции для определяемых пользователем типов . (Изначально мой вопрос был мотивирован обсуждением незаконности добавления типов в пространство...
648 просмотров

пространство имен, конфликт ADL члена класса
#include <iostream> namespace outside { struct A { int outer = 42; friend void print(A const& a, std::ostream& os) { os << "outside::A " << a.outer << '\n'; } }; namespace inside { struct A :...
100 просмотров

Существуют ли другие правила, касающиеся ADL или конфликтов имен в отношении перегруженных операторов?
Я думаю, что этот пример лучше всего иллюстрирует мой вопрос: namespace N { class C { public: friend bool operator==(const C& c, const C& x) { return true; } friend bool f(const C& c, const...
130 просмотров

Как задокументировать функциональность внедрения друзей с помощью doxygen?
Учитывая некоторый код, как в следующем примере: class MyClass; class Injector { /** * @brief MyClass addition. */ friend MyClass operator+(MyClass a, MyClass b) { ... } }; class MyClass: private Injector {}; Как я могу...
1569 просмотров

Как компилятор находит шаблонную функцию X::max(T const&, T const&) через ADL в приведенном ниже коде?
Цитата из стандарта приветствуется. #include <iostream> namespace X { class A {}; } template <typename T> inline T const& max(T const& a, T const& b, T const& c) { return max(max(a, b), c); } inline X::A...
491 просмотров

Cxx-prettyprint (для стандартных контейнеров) определяет свои операторы вывода внутри пространства имен std - это стандартное нарушение?
Я успешно использую cxx-prettyprint: C ++ Container Pretty-Printer для записи значений контейнера. (См. Также Контейнеры STL C ++ с красивой печатью ). Он прекрасно работает даже на старый компилятор VS-2005 (VC8) (с заголовком...
210 просмотров

Может ли рефакторинг перегруженного оператора в функцию, не являющуюся членом, сломать какой-либо код?
Рассмотрим устаревший шаблон класса с перегруженными операторами сложения += и + . template<class T> class X { public: X() = default; /* implicict */ X(T v): val(v) {} X<T>& operator+=(X<T> const& rhs)...
214 просмотров

Постфиксное выражение со списком аргументов-шаблонов не подхватывается ADL
Я хочу понять, почему вызов шаблона f ниже не компилируется: struct A { template<class...> friend void f(A) { } } x; int main() { f<>(x); } ADL требует, чтобы постфиксное выражение в вызове функции было неполным...
69 просмотров
schedule 11.05.2023

Как использование std :: swap включает ADL?
В Что такое идиома копирования и обмена показан этот пример: friend void swap(dumb_array& first, dumb_array& second) // nothrow { // enable ADL (not necessary in our case, but good practice) using std::swap; // by swapping...
4438 просмотров
schedule 10.04.2022

Возможная ошибка ADL в Visual Studio 2013
Следующий упрощенный код не компилируется в VS2013: #include <cmath> namespace mine { template <typename A> struct Base { double value() const { return static_cast<const A&>(*this).value(); } };...
290 просмотров

Оператор выходного потока Argument Dependent Lookup (ADL) для основных/STL-типов/классов
Я хочу преобразовать unsigned char и std::vector<unsigned char> в шестнадцатеричную строку. В настоящее время я использую выходной поток operator<< для реализации преобразования, но этот подход, похоже, имеет некоторые недостатки в...
170 просмотров

Почему ADL не работает с Boost.Range?
Учитывая: #include <cassert> #include <boost/range/irange.hpp> #include <boost/range/algorithm.hpp> int main() { auto range = boost::irange(1, 4); assert(boost::find(range, 4) == end(range)); } Демо Live Clang...
980 просмотров