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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните про volatile 
V
    Опции темы
borisbn
Дата 9.10.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Всем привет!

На ИРКе задали такой вопрос: как заставить работать шаблонную версию
Код

template<size_t N>
void size(const char(&arr)[N]) {
    cout << "ref " << N << endl;
}
void size(const char* arr) {
    cout << "pointer" << endl;
}

size("foo");

http://liveworkspace.org/code/c604f09278a1...04bacd89ad94f5c

Ответ меня несколько обескуражил:
Код

template<size_t N>
void size(const char(&arr)[N]) {
    cout << "ref " << N << endl;
}
void size(const volatile char* arr) { // <------ (volatile)
    cout << "pointer" << endl;
}

size("foo");

http://liveworkspace.org/code/44b1abd0c724...c498ad7c8681910

Можете объяснить, каким образом volatile не даёт работать второй ф-ции, когда вызывается size("foo"); ?
Спасибо.

P.S. ИРКа англоязычная, и выяснять там сложнее, чем на великом и могучем
P.P.S. Интересно услышать мнение тёзки сабжа smile

Это сообщение отредактировал(а) borisbn - 9.10.2011, 15:05


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 9.10.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



borisbn

Цитата(borisbn @  9.10.2011,  15:03 Найти цитируемый пост)
Можете объяснить, каким образом volatile не даёт работать второй ф-ции, когда вызывается size("foo"); ?

Точно также, как и любой другой квалификатор. Компилятор не находит более подходящую перегрузку и вызывает ее.
Конкретно в твоем примере при первом вызове срабатывает версия с массивом, так-как "foo" это массив символов, а во втором случае тип const char*.
volatile просто делает перегрузку менее подходящей для вызова. Хотя на самом деле я сильно сомневаюсь в правильности такого решения.
И вообще volatile не для того создан.

Это сообщение отредактировал(а) azesmcar - 9.10.2011, 15:33
PM   Вверх
borisbn
Дата 9.10.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(azesmcar @  9.10.2011,  15:32 Найти цитируемый пост)
volatile просто делает перегрузку менее подходящей для вызова

то, что рейтинг функции с const char * стал меньше для выбора - я понял. Не понял как на это повлиял volatile  smile 

Цитата(azesmcar @  9.10.2011,  15:32 Найти цитируемый пост)
Хотя на самом деле я сильно сомневаюсь в правильности такого решения.

однозначно, решение  какое-то ...мммм... странное. Я бы его не использовал. Просто стало интересно и захотелось разобраться почему так происходит

Это сообщение отредактировал(а) borisbn - 9.10.2011, 16:10


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 9.10.2011, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(azesmcar @  9.10.2011,  15:32 Найти цитируемый пост)
так-как "foo" это массив символов

Все-же, формально, это не совсем массив символов. Потому-что если явно задать массив, то волатайл не нужен.
http://liveworkspace.org/code/9ad72a5df592...e639ea8a02245ad


Цитата(borisbn @  9.10.2011,  15:03 Найти цитируемый пост)
Интересно услышать мнение тёзки сабжа 

Все эти приоритеты при неявном приведении, тёмная сторона С++. имхо, и еще раз имхо...
PM MAIL   Вверх
mes
Дата 9.10.2011, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  9.10.2011,  18:34 Найти цитируемый пост)
Все-же, формально, это не совсем массив символов. 

формально говоря, это совсем не массив  символов smile 


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 9.10.2011, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



и всё же... каким образом этот
Цитата(mes @  9.10.2011,  22:32 Найти цитируемый пост)
совсем не массив  символов

попадает в ф-цию, ожидающую массив символов, если к указателю добавить volatile? не понимаю


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 9.10.2011, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(mes @  9.10.2011,  22:32 Найти цитируемый пост)
формально говоря, это совсем не массив  символов   

mes, а что это?

borisbn, мой пример не совсем корректный. я там забыл const поставить.
А если его поставить, то все меняется...
http://liveworkspace.org/code/abfc4931bd80...7ed845d79a235e1
 smile 
PM MAIL   Вверх
volatile
Дата 9.10.2011, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Короче, открыл щаз студию.

Код:
Код

#include <iostream>
using namespace std;

template<size_t N>
void size(const char(&arr)[N])
{
    cout << "ref " << N << endl;
}
void size(const /*volatile */char* arr)
{
    cout << "pointer" << endl;
}

int main()
{
    char arr [] = "foo";
    size(arr);
    const char * foo = "foo";
    size(foo); 
} 

MS VC2008 выход:
Цитата

pointer
pointer


gcc (liveworkspace.org) выход:
Цитата

ref 4
pointer


На лицо явно баг! Но чей?, кто из них врёт? Здесь явно не может быть "имплементейшн дефайнед"


Это сообщение отредактировал(а) volatile - 9.10.2011, 23:56
PM MAIL   Вверх
volatile
Дата 10.10.2011, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



borisbn, Ваш код из первого поста http://liveworkspace.org/code/44b1abd0c724...c498ad7c8681910
На студии также ведет себя не так как gcc
студия выход:
Цитата

pointer
pointer


Добавлено через 4 минуты и 11 секунд
Вообще, мое мнение такое (и пусть меня закидают помидорами).
Шаблонная функция всегда, по правилам С++, имеет меньший приоритет перед явной.

Посему - это всего лишь баг gcc, и волотайл, здесь не спасет... (могу ошибаться)

PM MAIL   Вверх
math64
Дата 10.10.2011, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 8
Всего: 72



Кроме того,
Код

template<size_t N>
void size(const char arr[N])
{
    cout << "array" << N << endl;
}
template<size_t N>
void size(const char (&arr)[N])
{
    cout << "rarray" << N << endl;
}
void size(const char* arr) {
    cout << "сpointer" << endl;
}
void size(char* arr) {
    cout << "pointer" << endl;
}
void main()
{
size("foo");
char foo[] = "foo";
size(foo);
const char cfoo[] = "cfoo";
size(cfoo);
}

gcc:
cpointer
pointer
cpointer
Закомментарить void size(char* arr)
cpointer
rarray 4
cpointer
В size(const char arr[N]) - никогда не попадаем

Это сообщение отредактировал(а) math64 - 10.10.2011, 08:23
PM   Вверх
azesmcar
Дата 10.10.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  9.10.2011,  22:32 Найти цитируемый пост)
формально говоря, это совсем не массив  символов smile  

Цитата

2.13.4 String literals

An ordinary string literal has type “array of n const char” and static storage duration...


Цитата(borisbn @  9.10.2011,  15:54 Найти цитируемый пост)
Не понял как на это повлиял volatile  

квалификатор volatile как и const является частью сигнатуры функции и участвует в выборе перегрузки (или как там переводиться overload resolution?).
Цитата

1.3.10 signature

the information about a function that participates in overload resolution (13.3): the types of its parameters
and, if the function is a class member, the cv- qualifiers (if any) on the function itself and the class in which
the member function is declared.2) The signature of a function template specialization includes the types of
its template arguments (14.5.5.1).


Добавлено через 1 минуту и 30 секунд
cv- qualifiers - это const volatile квалификаторы (если что smile )
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1015 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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