Описание тега argument-dependent-lookup

Форма поиска по имени в C++, которая позволяет находить имена функций в пространствах имен, связанных с аргументами, используемыми в вызове функции.
2 ответа

Почему Argument Dependent Lookup не работает с шаблоном функции dynamic_pointer_cast

Рассмотрим следующую программу на C++: #include <memory> struct A {}; struct B : A {}; int main() { auto x = std::make_shared<A>(); if (auto p = dynamic_pointer_cast<B>(x)); } При компиляции с MSVC 2010 я получаю следующую ошибку: …
23 мар '12 в 12:01
1 ответ

Определение функции в пространстве имен, отличном от ADL, "локального" или глобального пространства имен

Смотрите код ниже: #include <iostream> /// Definition of void perform(a_lib::a_class&). Where should I put this definition? /// See the comments below for where I've tried placing it. // void perform(a_lib::a_class&) { // std::cout &lt…
04 апр '16 в 11:44
2 ответа

Как сделать так, чтобы ADL предпочитал шаблон функции другому

Мне было интересно, можно ли ADL выбрать шаблон функции, определенный в пространстве имен класса одного из аргументов (или в каком-то другом четко определенном месте) в ситуации, когда видны другие шаблоны функций. У меня есть мотивирующий пример, к…
1 ответ

Понимание области действия операторов в C++

#include <iostream> namespace Foo { class Baz { }; std::ostream& operator<< ( std::ostream& ostream , const Baz& baz ) { return ostream << "operator<<\n"; } } int main() { std::cout << Foo::Baz(); } Я опреде…
1 ответ

Вызов функции шаблона друга без определения параметра в шаблоне класса

Я экспериментировал с вызовом шаблонной функции друга без параметра, который определен в шаблоне класса. Я не нашел решения именно для этого случая и решил свою проблему другим путем, но во время своих экспериментов я неожиданно нашел какой-то интер…
2 ответа

Почему этот вызов swap() неоднозначен?

Следующая программа #include <algorithm> #include <utility> #include <memory> namespace my_namespace { template<class T> void swap(T& a, T& b) { T tmp = std::move(a); a = std::move(b); b = std::move(tmp); } template&l…
1 ответ

Какое пространство имен содержит объявление этой функции-друга?

friend Функция ниже не найдена обычным поиском (§7.3.1.2/3), но найдена ADL (§3.4.2/4 вторая точка маркера), поэтому код компилируется и выполняется нормально ( пример в реальном времени). Но функция f не объявлено ни в одном пространстве имен. Напр…
2 ответа

Почему endl(std::cout) компилируется

Удивительно, но приведенный ниже код компилируется и работает без ошибок на различных компиляторах и версиях. #include <iostream> int main() { endl(std::cout); return 0; } Идеальная ссылка Как это компилируется? Я уверен, что нет endl в глобал…
27 мар '15 в 07:03
5 ответов

В каких ситуациях срабатывает аргументный поиск по имени (ADL)?

В статье Википедии ниже цитата упоминается: ADL происходит только в том случае, если при обычном поиске безусловного имени не удается найти соответствующую функцию-член класса. В этом случае можно искать другие пространства имен, не рассматриваемые …
22 фев '13 в 08:35
5 ответов

Почему был изобретен зависимый от аргумента поиск?

Почему был изобретен зависимый от аргумента поиск (ADL)? Это просто так мы можем написать cout << stuff вместо std::operator<<(cout, stuff)? Если это так, то почему ADL не ограничивается операторами вместо всех функций? Могло бы быть пре…
25 ноя '10 в 11:56
1 ответ

Вызов функции по ADL из другой функции

У меня есть вопрос, касающийся того, как типы обнаруживаются ADL в общих ситуациях. В частности, у меня есть некоторый "универсальный" код, где мне нужно проверять во время компиляции наличие функции, которая должна быть найдена ADL. Например: #incl…
20 янв '13 в 14:59
3 ответа

Есть ли законный способ печати кортежей и пар с помощью оператора <<?

У меня есть набор шаблонов / функций, которые позволяют мне печатать кортеж / пару, предполагая, что каждый тип в кортеже / паре имеет operator&lt;&lt; определено для этого. К сожалению, из-за 17.4.3.1, это незаконно, чтобы добавить мой operator&lt;…
22 фев '11 в 09:16
1 ответ

Как компилятор находит функцию шаблона X::max(T const&, T const&) через ADL в приведенном ниже коде?

Цитата из стандарта приветствуется. #include &lt;iostream&gt; namespace X { class A {}; } template &lt;typename T&gt; inline T const&amp; max(T const&amp; a, T const&amp; b, T const&amp; c) { return max(max(a, b), c); } inline X::A const&amp; max(X:…
2 ответа

Перегрузка оператора C++ и связанное пространство имен

Следующий упрощенный пример компилируется в gcc а также Visual Studio, но не в clang!? namespace N { struct A {}; template &lt;typename T&gt; double operator+ (T a, double d) {return d;} template &lt;typename T&gt; double operator+ (double d, T a) {…
2 ответа

Почему функция, объявленная внутри другой функции, не участвует в зависимом от аргумента поиске?

Рассмотрим простой пример: template &lt;class T&gt; struct tag { }; int main() { auto foo = [](auto x) -&gt; decltype(bar(x)) { return {}; }; tag&lt;int&gt; bar(tag&lt;int&gt;); bar(tag&lt;int&gt;{}); // &lt;- compiles OK foo(tag&lt;int&gt;{}); // '…
2 ответа

Получить элемент из кортежа

Возможный дубликат: Почему ADL не находит шаблоны функций? призвание get похоже, не вызывает зависимый от аргумента поиск: auto t = std::make_tuple(false, false, true); bool a = get&lt;0&gt;(t); // error bool b = std::get&lt;0&gt;(t); // okay g ++ 4…
2 ответа

Как ADL должен работать для этого?

Недавно я столкнулся с проблемой с компилятором clang++ 5.0.0, когда через ADL он не подбирал правильную функцию на Mac (но g ++ делал это правильно на Linux). Я хотел бы знать, является ли это компилятором ИЛИ плохой дизайн класса вообще. Вот приме…
23 сен '14 в 16:52
2 ответа

Работает ли ADL с именованными лямбдами?

Скажем, у меня есть класс и именованная лямбда в одном пространстве имен. namespace bla { class X { /* ... */ }; static auto lambda = []( X param ){ /* ... */ }; } Эта лямбда почти эквивалентна функции, которая была объявлена ​​встроенной. Но могу л…
21 июн '13 в 13:42
4 ответа

Каково предпочтение разрешения имени функции / метода / шаблона в C++?

Как компилятор C++ решает, какую функцию / метод вызывать, если существует несколько возможностей? В моем конкретном случае у меня есть стандартная свободная функция времени выполнения C++, и у меня также есть шаблонный бесплатный вариант, например:…
23 фев '10 в 16:19
1 ответ

Перегрузка пространства имен, квалифицированная как operator==

Мне интересно, почему следующее не компилируется: #include &lt;iostream&gt; #include &lt;functional&gt; namespace Bar { struct Foo { int x; }; } // Namespace static bool operator==(const Bar::Foo&amp; a, const Bar::Foo&amp; b) { return a.x == b.x; }…
31 июл '15 в 00:42