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)
这里可能有什么问题?提前致谢。
根据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 模式下启用。