2015-08-28 27 views
7

Perché questa linea non si compila:funzionale C++ 11 strano comportamento

function<const int&(const int&, const int&)> min_ptr = min<int>; 

Ma questo funziona bene:

const int &(*min_ptr)(const int&, const int&) = min<int>; 

sembrerebbe che la classe funzione è la sostituzione flessibile e confortevole per la funzione puntatori. Ma perché questo caso non funziona?

MODIFICA. Il mio codice:

#include <functional> 
#include <algorithm> 
#include <cmath> 
using namespace std; 
int main() 
{ 
    const int&(*min_ptr)(const int&, const int&) = min<int>; //It is works fine 
    function<const int&(const int &, const int&)> min_f = min<int>;// Doesn't compile 
    /* 
     Error message: 
     error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type 
     ‘std::function<const int&(const int&, const int&)>’ requested function<const int&(const int &, const int&)> min_f = min<int>; 
    */ 
    return 0; 
} 

gcc version 4.8.2, --std = C++ 11

+1

Real program please, e veri messaggi di errore. Potrebbe essere semplice come manca 'std ::'. – MSalters

+1

infatti, mi compila con 'using namespace std;' –

+0

Compilatore, versione e flag? – Yakk

risposta

9

L'assegnazione di

const int &(*min_ptr)(const int&, const int&) 

getta anche il min<int> ad una firma particolari. Il cast a std::function no.

Aggiungi

static_cast<const int &(*)(const int&, const int&)> 

all'assegnazione std::function per farlo funzionare.

auto* min_ptr = min<int>; 

non funziona.

C'è più di un sovraccarico di min<int> da considerare.

std::function<const int&(const int &, const int&)> min_ptr = 
    [](auto&&...args)->decltype(auto){ 
    return min<int>(decltype(args)(args)...); 
    }; 

funziona anche in C++ 14.

+0

Ma * perché * non esegue il cast di std :: function cast min per una firma particolare? – syntagma

+0

@REACHUS il problema che il [costruttore '' std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function/function) prende qualsiasi cosa sotto il sole. – CoffeeandCode

+0

Ma perché dopo aver dichiarato la variabile 'min_ptr' con il compilatore di tipo fisso non è possibile lanciare automaticamente argomenti di destra per questo tipo? –