Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.59.165] |
|
Сообщ.
#1
,
|
|
|
Всем привет. Кто-то может объяснить это с т. з. Стандарта?
https://ideone.com/KiYNWi #include <iostream> #include <string> #include <vector> void f(const std::string& x) { std::cout << "void f(const std::string& x)"; } void f(std::vector<int>* x) { std::cout << "void f(std::vector<int>* x)"; } int main() { f({}); } |
Сообщ.
#2
,
|
|
|
Ну... Имеем две сигнатуры f(), одна принимает l-value const reference, вторая указатель. К первой, согласно Reference binding, может быть применено identical conversion, был бы какой-нибудь r-value типа std::string. Чтобы иметь std::string, нужен подходящий конструктор, принимающий {}. Их два: принимающий const std::string::value_type* и принимающий std::initializer_list<std::string::value_type>. Оба могут быть использованы, но для первого требуется user defined conversion, а второй identity conversion, поэтому отбирается он. Однако он имеет (List-initialization sequence) ранг worst при наличии других одинаково подходящих сигнатур.
Для второй сигнатуры {} рассматривается как value initialization, которое для указателей является zero initialization как для скалярных. Это identity conversion, которое совпадает с identity conversion для предыдущей сигнатуры, однако, т.к. для той декларируется worst, выбирается т.о. вторая сигнатура. |
Сообщ.
#3
,
|
|
|
Qraizer, спасибо.
|