C++11 功能 std::map::at 在旧版本的 C++ 上编译

Nic*_*ick 6 c++ g++ cmake c++11 c++03

下面的代码使用c++11 中引入的代码,但是,在 g++ 和 cmake 中std::map::at指定旧版本(我已经尝试过-std=c++03,-std=c++0x和)时,它仍然会被编译。-std=c++98其他 c++11 功能不起作用,例如基于范围的 for 循环。

#include <iostream>
#include <map>

int main() {
    std::map<int, int> my_map;
    my_map[0] = 1;
    std::cout << my_map.at(0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g++命令:

g++ -std=c++03 -o main *.cpp
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project(test)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
add_executable(main main.cpp)
Run Code Online (Sandbox Code Playgroud)

两种情况下的输出:

1
Run Code Online (Sandbox Code Playgroud)

这里可能有什么问题?提前致谢。

Fed*_*dor 0

根据https://en.cppreference.com/w/Talk的讨论:cpp/container/map/at 确实在原始C++98 标准std::map::at中缺失

技术上std::map::at出现在图书馆工作组LWG 464中并被采纳到 2008 年标准草案中。另一方面,编译器似乎确实将 LWG 464 实现为缺陷报告。Clang、GCC、MSVC - 这些都在 C++98 模式下启用。