簡體   English   中英

具有默認參數的可行函數

[英]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 
}

DEMO

但是我遇到了編譯時錯誤。 為什么標准說它沒問題?

區別在於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM