Николай Меркин ([info]kodt_rsdn) wrote,

Ваистену!

http://codepad.org/KOHPJrQG
#include <iostream>
int main()
{
  volatile const char* v = "false";
  std::cout << v;
}
Программа выводит true!

(спасибо RSDN за прекрасную наводку)
Tags: возопиил, дурево, программирование

  • Post a new comment

    Error

    Your reply will be screened

    Your IP address will be recorded 

  • 8 comments

[info]adontz

July 23 2010, 10:03:22 UTC 1 year ago

Вопрос для собеседования, ЛОЛ.

[info]fat_crocodile

July 23 2010, 10:48:47 UTC 1 year ago

у меня выводит 1.
интересно.

[info]kodt_rsdn

July 23 2010, 11:00:41 UTC 1 year ago

Это зависит от того, включено ли cout<<boolalpha по умолчанию (как на кодепаде) или нет (как у обычных сборок компиляторов). На RSDN был пример, когда v="666", и выводился 1.

[info]fat_crocodile

July 23 2010, 11:04:14 UTC 1 year ago

Да, это-то понятно. Не понятно, почему так влияет слово volatile на указатели. Оно так же влияет на int*. А на просто int -- не влияет.

[info]kodt_rsdn

July 23 2010, 11:11:04 UTC 1 year ago

Эхъ. Объясняю.
Среди операторов << есть сигнатуры, принимающие (const char*) и (const void*).
Снятие волатильности, равно как снятие константности - не может быть неявным. Вот наложение - это пожалуйста.
Соответственно, ни одна из штатных сигнатур не подошла.
Зато подошла (bool) - проверка указателя на NULL.

Отсюда мораль: volatile - зло :)

[info]kodt_rsdn

July 23 2010, 11:12:32 UTC 1 year ago

Да, а снятие-наложение cv-квалификаторов на rvalue никого не волнует.
Привести cv int& к int& нельзя, а cv int к int - можно.

[info]fat_crocodile

July 23 2010, 11:14:01 UTC 1 year ago

Спасибо. Действительно, зло. Но хотя бы логичное.

[info]axc

July 23 2010, 11:49:22 UTC 1 year ago

Шикарно!
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…