我是c ++的新手,我怀疑,这个问题当然不仅与tuple
有关。
因此,我看了一个大致包含以下代码的教程:
#include <tuple>
std::tuple<...> t(...)
为什么#include <tuple>
?特别是考虑到我们明确编写了std::tuple
的事实。没有那行#include
的情况下,代码编译得很好...
答案 0 :(得分:10)
因为<tuple>
是一个头文件,其中包含名称空间tuple
中的std
类。仅仅因为您明确地说std::
并不意味着编译器将能够找到它(如果未包括在内)。
在这种情况下它为您工作的原因可能是因为您包含的另一个标头已经包含<tuple>
,因此您的代码间接包含了<tuple>
或您所使用的编译器自动包含了它。该标准不不能保证,也不应该依赖此标准。始终包含使代码可移植所需的标头。
答案 1 :(得分:9)
对于您在代码中使用的任何类型,您都应始终包括特定的标头。
在没有该行
#include
的情况下,代码编译得很好...
您的代码无需编译是偶然的,因为它可能已包含在您在程序中使用的另一个标准标头中,并且不受该标准的保证,因此不可移植。
尤其是考虑到我们明确编写了
std::tuple
。
明确使用std::
名称空间对该规则没有任何意义。
您还应该始终清楚地使用std
命名空间中的类或类型,以免引起歧义。
相关内容:
答案 2 :(得分:2)
在C ++中,您需要包括所有使用的标头。 std::
与名称空间有关,完全不同。
显然,您的编译器很聪明,足以应付它,但大多数编译器都不会。
答案 3 :(得分:1)
某些标准标头应包括根据C ++标准的其他标准标头。例如,标题<algorithm>
必须包含标题<initializer_list>
。
但是,允许实施人员自行决定在其他标准标头中包括标准标头。
您不应依赖于此,因为使用一个编译器编译的程序将不会使用另一个编译器进行编译。
即使根据C ++ Standard的要求,一个标准标头包含在另一个标准标头中,仍然是一个很好的做法,明确地包含这样的标头,因为程序的用户(某些其他程序员)应该考虑到以下方面的依赖性:标头,并且可以自由包含或排除其他标头。