2016-11-16 37 views
0

Я смотрел на это answer и хотел использовать. Однако я получаю ошибку сегментации при использовании static_cast и const_cast, но если я использую временную переменную, все в порядке. Это, очевидно, потому, что неконстантная версия bar() называет ее самонастраивающейся. Но я, хотя static_cast приведет к const foo*, а затем выберем версию const bar(). Почему это так?Почему const_cast (или static_cast) не добавляет const?

#include <iostream> 
using namespace std; 

class foo 
{ 
    public: 
    void bar() const 
    { 
     cout << "const" << endl; 
    } 

    void bar() 
    { 
     cout << "non-const" << endl; 

//  static_cast<const decltype(this)>(this)->bar(); 

//  const_cast<const decltype(this)>(this)->bar(); 

     const auto& tmp = *this; 
     tmp.bar(); 
    } 
}; 

int main() { 
    foo A; 
    A.bar(); 
    const foo B; 
    B.bar(); 
    static_cast<const foo*>(&A)->bar(); 
    return 0; 
} 
+0

@songyuanyao, удалите прокомментированные строки. Он будет recurse forever – StoryTeller

+1

'this' является указателем, поэтому он имеет тип' foo * '. Когда вы добавляете константу в 'foo *', вы получаете 'foo * const', а не' foo const * ', как вы могли ожидать. – ach

ответ

5

decltype(this) является foo*. И const decltype(this) - foo* const.

Вы не меняете указатели cv-квалификации, только указатели. Поэтому непостоянная перегрузка выбирается каждый раз.

+1

Хорошо, это на самом деле имеет смысл. Я предполагаю, что то же самое происходит, если я передам его ссылке, тогда это будет 'foo & const' (что абсурдно) вместо' const foo & '. – Jonas

+1

Что также намекает на то, что можно было бы сделать вместо этого, но может быть полезно указать явно: 'static_cast *> (this)' должен работать. Это долго, но это позволяет избежать того, что я думаю, что OP пытался избежать: он избегает указания типа явно. – hvd

+1

@hvd, можно также использовать 'static_cast :: type> (this)', где мета-функция определена как [this] (http://ideone.com/RPGzLf). Не тщательно протестировали. – StoryTeller