std :: işlev sabitliği


11

Diyelim ki böyle bir çağrılabilir türü var:

struct mutable_callable
{
    int my_mutable = 0;
    int operator()() { // Not const
        return my_mutable++;
    }
};

Not mutable_callableolmayan bir const sahiptir operator()değiştirir üye değişkeni olduğunu .....

Şimdi varsayalım türümden bir std::functiondışarı:

std::function<int()> foo = mutable_callable{};

Şimdi bunu yapabilirim:

void invoke(std::function<int()> const& z)
{
    z();
}

int main()
{
    invoke(foo); // foo changed.....oops
}

Şimdi bildiğim kadarıyla söyleyebilirim std::functions operator()olduğu const: uyarınca ) (https://en.cppreference.com/w/cpp/utility/functional/function/operator

Yani benim içimdeki his, bunu yapamamanız gerektiğidir .....

Ama sonra şuraya bakın: https://en.cppreference.com/w/cpp/utility/functional/function/function

Bu çağrılabilir tür sabit olup olmadığını herhangi bir kısıtlama koymak gibi görünmüyor operator()......

Ben varsayarak doğru duyuyorum: Bu benim soru Yani std::function<int()> const&esasen aynı şey std::function<int()>&olduğunu ikisinin davranışları arasındaki fark hiçbir aslında orada olduğunu ...... ve bu durumda ise neden değil mi constdoğru?


@MaxLanghof Hayır ..... std::functioniçinde eşdeğer bir struct a{ std::any x; };..... var
DarthRubik

MSVC std::functionuygulamasının iç kısımlarının küçük bir parçası : i.stack.imgur.com/eNenN.png burada using _Ptrt = _Func_base<_Ret, _Types...>. Diyeceğimi dedim.
Max Langhof

Yanıtlar:


3

Bu aynı aşağı kaynar struct A { int* x; };nerede içinde, const A a;değiştirebileceğiniz değerini ait *(a.x)(ama işaret değil nerede). İçinde yayılmayan std::function(silme tipinden) dolaylı bir seviye vardır const.

Ve hayır, std::function<int()> const& fanlamsız değil. Bir durumda , durumda yapamayacağınız std::function<int()>& ffarklı bir işlev atayabilirsiniz .fconst


Evet ... bu aslında bir anlam ifade ediyor ..... yine de ilk bakışta kafa karıştırıcı
DarthRubik

Bunun bir tasarım hatası olduğuna inanıyorum. Bu dolaylı anlatım, kullanıcı için saydam bir uygulama detayı olmalıdır ve sabitlik, bir miktar meta programlamayla yayılabilir.
Igor

@IgorR. Evet, sabitlik yayılabilir. std::vectorbunu yapar std::unique_ptr, değil. Bence std::functiongerçekten de functor devletinin değişmezlerini ifade etmekle ilgili değil. Belki de iğrenç işlev türlerini (yani std::function<int() const>) ayırt etmek için yeniden kullanabiliriz?
Max Langhof

unique_ptrnormal işaretçi olmadığı için sabitlik yaymamalıdır. Ve std::function<int() const>derlemezdim.
Igor

@IgorR. Biliyorum. Demek istediğim, standart kütüphanenin bazı bölümlerinin bunu, bazılarının bunu yapmadığıydı. Hangi kategoriye girmem std::functiongerektiği net değil. Ve bu std::function<int() const>varsayımsaldı - elbette şimdi derlenmiyor, ama eğer bu geçerli kılınabiliyorsa, örneğin OP'yi "sadece operator() const(veya vatansız olanlarla) atanmış functorlara atanabilir " şeklinde ifade eder mi? (iğrenç işlev türlerinin kullanılması nedeniyle oldukça iğrenç olan sahnelerin arkasında bile)?
Max Langhof
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.