ADL在构造函数初始化列表中

Mor*_*enn 3 c++ initialization-list argument-dependent-lookup c++11

如何在构造函数初始化列表中启用ADL?例如,假设我有一个bignum具有命名空间级abs功能.现在我想编写一个类Foo,用传递给构造函数的实例的绝对值初始化其成员; 它应该使用命名空间级别,abs如果它存在,std::abs否则:

template<typename T>
struct Foo
{
    T _data;

    Foo(T data):
        _data(abs(data)) // I want find abs with ADL here
    {}
};
Run Code Online (Sandbox Code Playgroud)

无论如何,在类范围内禁止使用声明,我不想"污染"命名空间.如何启用ADL以使其在构造函​​数初始化列表中工作?

小智 8

您可以使用lambda表达式直接从初始化列表中解决此问题:它允许您内联编写所需的帮助函数,并且该辅助函数可以包含using std::abs;.

template<typename T>
struct Foo
{
    T _data;

    Foo(T data):
        _data([&](){ using std::abs; return abs(data); }())
    {}
};
Run Code Online (Sandbox Code Playgroud)