Почему это нарушение прав доступа происходит с флагами / Og и / GL с передачей по ссылке?

Когда (и только когда) я компилирую свою программу с / 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. Есть идеи, может ли это иметь место, или это другой случай, о котором я не знаю?

9
задан Mehrdad 29 August 2011 в 15:32
поделиться