Нетипичный ссылочный параметр может быть изменен во время выполнения, означает ли это, что шаблон может быть создан во время выполнения? - PullRequest
0 голосов
/ 07 июня 2018

Недавно я узнал о нетиповых ссылочных параметрах, таких как template<auto& t>.Затем я обнаружил, что t может быть изменено во время выполнения:

#include <iostream>
template<auto& N>
struct X{
    int operator()() { return N; }
};

int a = 2;
int main()
{
    std::cin >> a; //stdin: 5
    auto temp = X<a>();
    std::cout << temp() << '\n';
}

Выходные данные 5, а не 2.Означает ли это, что temp создается во время выполнения?


Я постараюсь ответить на свой вопрос.Если что-то не так, пожалуйста, поправьте меня, спасибо!Другие ответы также приветствуются!

1 Ответ

0 голосов
/ 07 июня 2018

Нет, Все, что требуется в соответствии со стандартом, заключается в том, чтобы наблюдаемое поведение было таким, как если бы шаблоны были созданы до запуска программы..

Причина вывода 5 заключается в том, что ссылочный тип auto и здесь просто означает, что

  • N будет связываться с a при создании экземпляра и
  • создание экземпляра все еще происходит в compile-time.

Посмотрите на это:

#include <iostream>
template<auto& N>
struct X{
    int operator()() { return N; }
};

int a;
int main()
{
    auto temp = X<a>();
    std::cout << "Compile-time: " << temp() << '\n'; //output 0
    std::cin >> a; //stdin: 5
    std::cout << "Run-time: " << temp() << '\n'; //output 5
}

live demo

Спасибо за комментарий Гийома Рашико,ниже это неправильно.

a инициализируется с 0 в время компиляции и изменяется в время выполнения .N in temp изменено с 0 ( время компиляции ) на 5 ( время выполнения ).

Обновление:

Во многих реализациях a хранится в сегменте bss и будет инициализироваться нулем или не иметь явной инициализации в исходном коде crt0 во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...