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.