Похоже, что Visual Studio
просто не работает в отношении того, какой конструктор он вызывает, когда аргумент по умолчанию представляет собой список инициализатора . Этот код:
#include
struct test {
test () { std::cout << "test ()" << std::endl ; }
test (int) { std::cout << "test (int)" << std::endl ; }
};
void func( test const &s = {} )
{
}
int main()
{
test s = {} ;
func() ;
}
производит этот результат в gcc
и clang
, смотрите его здесь :
test ()
test ()
, в то время как Visual Studio
производит это результат:
test ()
test (int)
и для этого кода:
#include
#include
struct test {
test () { std::cout << "test ()" << std::endl ; };
test (int) { std::cout << "test (int)" << std::endl ; };
test ( std::initializer_list) { std::cout << "test (initializer_list)" << std::endl ; } ;
};
void func( test const &s = {0} )
{
}
int main()
{
test s = {0} ;
func() ;
}
gcc
и clang
дают этот результат, смотрите в прямом эфире здесь :
test (initializer_list)
test (initializer_list)
, в то время как Visual Studio
выдает эту ошибку:
error C2440: 'default argument' : cannot convert from 'initializer-list' to 'const test &'
Reason: cannot convert from 'initializer-list' to 'const test'
No constructor could take the source type, or constructor overload resolution was ambiguous
Обновление
Для проверки работоспособности я вернулся к стандарту, чтобы убедиться, что там не было каким-то странным правилом, лежащим в основе этого различия, или, возможно, каким-то ограничением, делающим этот код некорректным . Насколько я могу судить, этот код не является неправильно сформированным . Грамматика секции 8.3.5
специально позволяет это:
parameter-declaration:
attribute-specifier-seqopt decl-specifier-seq declarator
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
[...]
Это не похоже на секции 8.5
Инициализаторы или 8.3.6
Аргументы по умолчанию добавляют любые ограничения, но отчет об этом дефекте 994. braced-init-list в качестве аргумента по умолчанию и рабочий документ Формулировка скобочных инициализаторов в качестве аргументов по умолчанию проясняет, что он был задуман, и обрисовывает в общих чертах изменения, внесенные в стандарт, чтобы позволить его и смотреть В дельтах нет явных ограничений.
Из моего .vimrc:
set scrolloff=3 " Keep 3 lines below and above the cursor
Вы также можете посмотреть на scrolljump, который устанавливает количество строк, прокручиваемых при нажатии на «границу», установленную с помощью scrolljump.
Try scrolloff=9999
. После того как курсор достигнет середины экрана, нажатие j переместит экран вверх на единицу, вместо того чтобы перемещать курсор вниз. Работает отлично, как только вы привыкнете к этому.