Когда я пытаюсь скомпилировать это с помощью набора инструментов Intel C++ Compiler 2022 для Visual Studio 2022:
#include <algorithm>
int main()
{
int x = 0;
std::inplace_merge(&x, &x, &x);
}
Я получил:
VC\Tools\MSVC\14.34.31933\include\xmemory(1429,48): error : reference to 'align_val_t' is ambiguous
_Pbuf = ::operator new (_Size, align_val_t{alignof(_Ty)}, nothrow);
^
VC\Tools\MSVC\14.34.31933\include\algorithm(7152,57): note: in instantiation of function template specialization 'std::_Optimistic_temporary_buffer<int>::_Optimistic_temporary_buffer<long long>' requested here
_Optimistic_temporary_buffer<_Iter_value_t<_BidIt>> _Temp_buf{(_STD min)(_Count1, _Count2)};
^
VC\Tools\MSVC\14.34.31933\include\algorithm(7160,10): note: in instantiation of function template specialization 'std::inplace_merge<int *, std::less<>>' requested here
_STD inplace_merge(_First, _Mid, _Last, less<>{});
^
Temp.cpp(6,7): note: in instantiation of function template specialization 'std::inplace_merge<int *>' requested here
std::inplace_merge(&x, &x, &x);
^
VC\14.34.31933\include\vcruntime_new.h(27,16): note: candidate found by name lookup is 'std::align_val_t'
enum class align_val_t : size_t {};
^
note: candidate found by name lookup is 'std::align_val_t'
Я пытался копаться в исходниках STL, но не могу найти, где двусмысленность.
Почему возникает эта ошибка? И как мне это обойти?
@ user17732522: Я пропустил 3 строки (есть какое-то запутанное чередование строк, которое я не могу понять, что мне пришлось исправить при вставке), но они относятся только к 1 месту. Я не вижу второго определения, которое было бы неоднозначным... если только оно не определено внутри компилятора или что-то в этом роде? И достаточно забавно, я на самом деле получаю сообщение об ошибке, если делаю #include <memory_resource>
int main() { }
.
@user17732522: user17732522: На самом деле, я думаю, что все... есть несколько внутренних определений компилятора. И ошибки возникают даже в том случае, если вы ссылаетесь на него без включения каких-либо заголовков!
Что ж, похоже, что-то очень не так. К сожалению, у меня нет установки, чтобы попытаться воспроизвести проблему.
Отвечая на мой собственный вопрос, но, похоже, это ошибка с предварительно скомпилированными заголовками. Это происходит, даже если предварительно скомпилированные заголовочные файлы пусты.
Избегание предварительно скомпилированных заголовков, похоже, позволяет избежать проблемы.
Если у кого-то есть лучший обходной путь или более подробная информация, пожалуйста, опубликуйте его.
Это все, что есть на выходе? Пишет, что правильный
std::align_val_t
найден, но не говорит, с чем он двусмысленный.