我在做家庭作業時注意到我的筆記本電腦上的編譯器比我們希望用於提交的計算機上的編譯器容許得多。我筆記本電腦上的C++編譯器是AppleClang 7.0.2.7000181
,提交框上的編譯器是g++ 4.9.2
。即,回想起來不應該編譯代碼,是:爲什麼這個C++代碼會與某些編譯器一起編譯而不是其他編譯器?
#include <iostream>
std::tuple<int, int> foo() {
return std::make_tuple(1, 1);
}
int main() {
auto pair = foo();
int x = std::get<0>(pair);
int y = std::get<1>(pair);
std::cout << x << "," << y << std::endl;
return 0;
}
我也有一個的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(foo)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Werror -Werror=sign-compare")
set(SOURCE_FILES main.cpp)
add_executable(foo ${SOURCE_FILES})
在我的筆記本電腦,鏘愉快地編譯此代碼,並打印出1,1
。沒有錯誤,沒有警告,什麼都沒有。在提交框中,我並不那麼幸運。
/home/nate/foo/main.cpp: In function 'std::tuple<int, int> foo()':
/home/nate/foo/main.cpp:3:26: error: return type 'class std::tuple<int, int>' is incomplete
std::tuple<int, int> foo() {
^
/home/nate/foo/main.cpp:4:12: error: 'make_tuple' is not a member of 'std'
return std::make_tuple(1, 1);
^
/home/nate/foo/main.cpp: In function 'int main()':
/home/nate/foo/main.cpp:8:21: error: 'void pair' has incomplete type
auto pair = foo();
^
/home/nate/foo/main.cpp:9:13: error: 'get' is not a member of 'std'
int x = std::get<0>(pair);
^
/home/nate/foo/main.cpp:10:13: error: 'get' is not a member of 'std'
int y = std::get<1>(pair);
^
這些錯誤是有意義的,因爲我不包括tuple
頭,但我不明白爲什麼這個代碼編譯在所有我的筆記本電腦。這裏發生了什麼?
AppleClang的標題可能間接包含或std :: tuple定義的其他來源。你必須看看標題才能確定。 –
非可移植代碼的問題在於它是......好吧,你能猜到嗎? –