[英]A viable function with a default argument
以下示例在N4296::13.3.3 [over.match.best]
namespace A
{
extern "C" void f(int = 5);
}
namespace B
{
extern "C" void f(int = 5);
}
using A::f;
using B::f;
void use()
{
f(3); // OK, default argument was not used for viability
f(); // Error: found default argument twice
}
我試着寫類似的東西:
#include <iostream>
namespace A
{
void foo(int a = 5){ std::cout << a << "1" << std::endl; }
}
namespace B
{
void foo(int a = 5){ std::cout << a << std::endl; }
}
using A::foo;
using B::foo;
int main()
{
foo(2); //Error
}
但是我遇到了編譯時錯誤。 為什么標准說它沒問題?
區別在於extern“C”,它會影響函數的命名空間成員資格:
來自http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1138.pdf
剩下的是關於'外部“C”語言聯系的“同一實體”的定義? 這由7.5節解決:
“最多一個具有特定名稱的函數可以具有C語言鏈接。 具有相同函數名稱的C語言鏈接的函數的兩個聲明(忽略限定它的命名空間名稱)出現在不同的命名空間范圍內引用相同的函數。 具有相同名稱的C語言鏈接的對象的兩個聲明(忽略限定它的命名空間名稱)出現在不同的命名空間作用域中引用同一個對象。
那是因為這兩個函數是從它們的命名空間導入的,這意味着同一個函數有2個定義,你可以這樣解決:
#include <iostream>
namespace A
{
void foo(int a = 5){ std::cout << a << "1" << std::endl; }
}
namespace B
{
void foo(int a = 5){ std::cout << a << std::endl; }
}
int main()
{
A::foo(2);
B::foo(3);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.