Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ("STRING" == str), почему не ошибка? 
V
    Опции темы
Alek86
Дата 12.2.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Код

#include <iostream>
#include <string>

int main() {
  std::string str = "String";
  if ("STRING" == str)
    std::cout << "Strings are equal" << std::endl;
}


не знаю как найти, из-за чего тут нет ошибки?

Добавлено через 1 минуту и 25 секунд
компиляции


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 12.2.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



из-за того, что operator == реализован не в виде члена класса std::string, а свободной функцией и в этом случае к левому операнду можно применять приведение и так как существует конструктор с параметром const char* левый операнд приводится к std::string и работает оператор сравнения для строк.
Короче потому, что operator == не член класса.

Добавлено через 1 минуту и 43 секунды
 smile мне этот вопрос в браинбенче тоже попался
PM MAIL   Вверх
Alek86
Дата 12.2.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



хех, я чето думал, конструктор преобразования у basic_string explicit

тогда еще вопрос - он не explicit именно задля ("STRING" == str)? Или по другим причинам?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 12.2.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Alek86 @  12.2.2008,  14:43 Найти цитируемый пост)
хех, я чето думал, конструктор преобразования у basic_string explicit

не совсем въехал причем здесь expicit...
используется вот этот конструктор
Код

basic_string(
   const value_type* _Ptr, 
   const allocator_type& _Al = Allocator ( )
); 

и , чесно говоря не вижу смысла иметь его  expicit , ибо по идее он должен работать как для const char* так и для char* и для строковых литералов, кои вообще являются массивами

Добавлено через 1 минуту и 17 секунд
Цитата(Alek86 @  12.2.2008,  14:43 Найти цитируемый пост)
тогда еще вопрос - он не explicit именно задля ("STRING" == str)? Или по другим причинам?

нет.
он для 
Код

std::string str("bla-bla");

PM MAIL   Вверх
Alek86
Дата 12.2.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Fazil6 @  12.2.2008,  15:50 Найти цитируемый пост)
не совсем въехал причем здесь expicit...

насколько я помню, то explicit делается потому же, из-за чего не рекомендуются операторы каста

Цитата(Fazil6 @  12.2.2008,  15:50 Найти цитируемый пост)

он для
код C++
1: std::string str("bla-bla");


разве при explicit эта конструкция не будет работать?
не будет работать
Код

std::string str = "bla-bla";




--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 12.2.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Alek86 @  12.2.2008,  15:50 Найти цитируемый пост)
разве при explicit эта конструкция не будет работать?

не будет  smile 
Код

#include <iostream>
class A
{
public:
    
    A(const char *){ std::cout << "A::A()\n"; }
    A& operator=(const char *){ std::cout << "O::A()\n"; } 
    
};


void main(void)
{
    A a = "bla=bla";

}

если запустить, то как и ожидалось получим вызов конструктора с параметром, а если сделать этот конструктор explicit , то не скомпилится, т.к. всетаки нужно приведение типа от типа литерала (const char[8]) к const char*
PM MAIL   Вверх
Alek86
Дата 12.2.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



помойму ты что-то путаешь...
explicit не может САМ вызываться неявно, а не "не может допускать неявное приведение типа в своем параметре"

именно потому его и рекомендуют почаще тыкать


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 12.2.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Alek86 @  12.2.2008,  17:55 Найти цитируемый пост)
помойму ты что-то путаешь...explicit не может САМ вызываться неявно, а не "не может допускать неявное приведение типа в своем параметре"

сори, я неправильно понял твою мысль. 
Цитата(Alek86 @  12.2.2008,  15:50 Найти цитируемый пост)
разве при explicit эта конструкция не будет работать?не будет работать

Ты прав, я просто не то имел в виду.
Ведь если имеем код
Код

void f(const std::string &)
{
/**/
}

то абсолютно привычно вызвать ее, например вот так
Код

f("bla-bla");

это я и мел в виду, поэтому мне удивительно почему ты вспомнил про explicit применительно к operator==...
PM MAIL   Вверх
Alek86
Дата 12.2.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Fazil6 @  12.2.2008,  19:08 Найти цитируемый пост)
 поэтому мне удивительно почему ты вспомнил про explicit применительно к operator==...

не к тому применительно
просто казалось, что если это уж такое "правило" - ставить explicit у конструкторов преобразования, то у basic_string он уж точно таков smile
оказалось, что не тут то было...


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 12.2.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Alek86 @  12.2.2008,  18:10 Найти цитируемый пост)
просто казалось, что если это уж такое "правило" - ставить explicit у конструкторов преобразования, то у basic_string он уж точно таков 

ну ты же понимаешь, что правило правилом, но до маразма тоже доводить не нужно. Преобразование char* -> std::string вполне логично и запрещать неявное преобразование в таком случае смысла , я например, не вижу
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.