簡體   English   中英

G ++,clang ++和std :: function

[英]G++, clang++ and std::function

我剛剛在C ++ 11中使用了新的std :: function,我編寫了一個用clang ++ 3.2和Intel C ++編譯器13.1編譯但不用g ++ 4.8編譯的例子。 在我將此報告為錯誤之前,我想我會檢查我是不是做了一些非常愚蠢的事情,而且這應該實際編譯。 那么,以下代碼是否有效c ++ 11?

template <typename C>
void map(C& c, std::function<typename C::value_type(typename C::value_type)> f)
{
    for(auto& x : c) {
        x = f(x);
    }
}

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    map(v, [](int x) { return x+2; });

    for(auto x : v) {
        std::cout << x << std::endl;
    }
}

我意識到這段代碼並不是很有用,但令我感到奇怪的是clang和Intel C ++編譯它並且gcc沒有。

編輯:當傳遞map函子或函數指針時,gcc也不會編譯相同的代碼:

struct {
    int operator() (int a) {
        return a+2;
    }
} add2s;
map(v, add2s);

int add2 (int a) {
    return a+2;
}
map(v,add2);

clang和icpc也編譯這兩個。

這是一個G ++錯誤,它可以簡化為以下示例,該示例不使用std::function (或標准庫中的任何內容):

template<typename T>
struct function
{
    function(int)
    { }
};

struct V {
  typedef int value_type;
};

template <typename C>
void map(C&, function<typename C::value_type>)
{
}

int main()
{
  V v;
  map(v, 1);
}

我已經將它作為PR 56874報告給bugzilla。 該問題與lambdas無關,而與非推導上下文中的類型無關,導致參數推斷失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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