Описание тега 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 <…
04 апр '16 в 11:44
2
ответа
Как сделать так, чтобы ADL предпочитал шаблон функции другому
Мне было интересно, можно ли ADL выбрать шаблон функции, определенный в пространстве имен класса одного из аргументов (или в каком-то другом четко определенном месте) в ситуации, когда видны другие шаблоны функций. У меня есть мотивирующий пример, к…
27 дек '15 в 15:43
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(); } Я опреде…
13 июн '13 в 10:23
1
ответ
Вызов функции шаблона друга без определения параметра в шаблоне класса
Я экспериментировал с вызовом шаблонной функции друга без параметра, который определен в шаблоне класса. Я не нашел решения именно для этого случая и решил свою проблему другим путем, но во время своих экспериментов я неожиданно нашел какой-то интер…
26 ноя '14 в 22:25
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…
03 дек '15 в 20:39
1
ответ
Какое пространство имен содержит объявление этой функции-друга?
friend Функция ниже не найдена обычным поиском (§7.3.1.2/3), но найдена ADL (§3.4.2/4 вторая точка маркера), поэтому код компилируется и выполняется нормально ( пример в реальном времени). Но функция f не объявлено ни в одном пространстве имен. Напр…
05 сен '14 в 19:05
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<< определено для этого. К сожалению, из-за 17.4.3.1, это незаконно, чтобы добавить мой operator<…
22 фев '11 в 09:16
1
ответ
Как компилятор находит функцию шаблона 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 const& max(X:…
02 июл '14 в 13:58
2
ответа
Перегрузка оператора C++ и связанное пространство имен
Следующий упрощенный пример компилируется в gcc а также Visual Studio, но не в clang!? namespace N { struct A {}; template <typename T> double operator+ (T a, double d) {return d;} template <typename T> double operator+ (double d, T a) {…
17 июн '15 в 17:39
2
ответа
Почему функция, объявленная внутри другой функции, не участвует в зависимом от аргумента поиске?
Рассмотрим простой пример: template <class T> struct tag { }; int main() { auto foo = [](auto x) -> decltype(bar(x)) { return {}; }; tag<int> bar(tag<int>); bar(tag<int>{}); // <- compiles OK foo(tag<int>{}); // '…
02 фев '18 в 15:55
2
ответа
Получить элемент из кортежа
Возможный дубликат: Почему ADL не находит шаблоны функций? призвание get похоже, не вызывает зависимый от аргумента поиск: auto t = std::make_tuple(false, false, true); bool a = get<0>(t); // error bool b = std::get<0>(t); // okay g ++ 4…
11 сен '11 в 07:55
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 <iostream> #include <functional> namespace Bar { struct Foo { int x; }; } // Namespace static bool operator==(const Bar::Foo& a, const Bar::Foo& b) { return a.x == b.x; }…
31 июл '15 в 00:42