[英]Are collisions between expressions and namespaces expected when invoking ADL?
給定以下示例,我希望解析器將std識別為一個函數:
#include <algorithm>
namespace test
{
class foo{};
void std(foo f);
}
int main()
{
std(test::foo());
return 0;
}
但是,對於GCC 4.8.4,這將導致錯誤- “錯誤:意外的名稱空間名稱'std':預期的表達式。”
使用clang 5.0時,出現“錯誤:意外的名稱空間名稱'std':預期表達式”
這是預期的嗎? 我無法想象解析器在這里沒有足夠的上下文來區分表達式和名稱空間?
編輯:示例使用應調用ADL的更復雜的類型。 在我的實際用例中,代碼是通用的,我需要ADL。
int
沒有ADL。
如果普通的不合格查找發現“既不是函數也不是函數模板的聲明” (例如名稱空間的聲明)等信息,則也沒有ADL。
您的示例由於幾個原因而無法正常工作。
它不使用ADL。 如果函數的參數是名稱空間中定義的類型,則將使用ADL。 例如
namespace test { struct bar {}; void foo(bar b) {} } // uses ADL to resolve to test::foo. foo(test::bar());
std
是一個名稱空間。 在沒有其他作用域限定符的情況下使用時,它是名稱空間的名稱。 因此,即使您使用了在命名空間中定義的類型,也不會使用ADL。 因此,以下情況也不正確。
namespace test { struct bar {}; void std(bar b) {} } std(test::bar());
請注意,您可以使用:
namespace test
{
struct bar {};
void std(bar b) {}
}
test::std(test::bar());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.