Когда (и только когда) я компилирую свою программу с / Og
и / GL
флаг с использованием компилятора Windows Server 2003 DDK C ++ (это нормально в WDK 7.1, а также в Visual Studio 2010!), я получаю доступ нарушение, когда я запускаю это:
#include <algorithm>
#include <vector>
template<typename T> bool less(T a, T b) { return a < b; }
int main()
{
std::vector<int> s;
for (int i = 0; i < 13; i++)
s.push_back(i);
std::stable_sort(s.begin(), s.end(), &less<const int&>);
}
Нарушение прав доступа исчезает , когда я изменяю последнюю строку на
std::stable_sort(s.begin(), s.end(), &less<int>);
- другими словами, оно исчезает, когда я позволяю моему элементу скопировать вместо простого , ссылающегося на .
(У меня вообще нет многопоточности.)
Почему такое могло произойти? Я вызываю какое-то неопределенное поведение, передавая const &
?
Флаги компилятора:
/ Og / GL / MD / EHsc
Флаги компоновщика: (нет)
ВКЛЮЧИТЬ переменную среды:
C: \ WinDDK \ 3790.1830 \ inc \ crt
Переменная среды LIB:
C: \ WinDDK \ 3790.1830 \ lib \ crt \ I386; C: \ WinDDK \ 3790.1830 \ lib \ wxp \ I386
Операционная система: Windows 7 x64
Платформа: 32-разрядная компиляция дает ошибку (64-разрядная версия работает правильно)
Я только что попробовал это с Windows XP DDK (это C : \ WinDDK \ 2600
), и я получил:
error LNK2001: unresolved external symbol
"bool __cdecl less(int const &,int const &)" (?less@@YA_NABH0@Z)
но , когда я изменил его с шаблона на обычную функцию , он волшебным образом работал с обоими компиляторами!
Я подозреваю, что это означает, что я обнаружил ошибку, которая возникает при получении адреса шаблонной функции с использованием компиляторов DDK. Есть идеи, может ли это иметь место, или это другой случай, о котором я не знаю?