为什么 free 函数不能在 C 数组上运行,而 std::begin 在某些情况下可以在 C++14 中运行?
Why can't the free function begin operate on C arrays while std::begin can in C++14 in some cases?
我注意到在某些情况下开始(没有名称空间规范的没有名称空间(,而在其他情况下会失败。
你们能解释一下为什么它在工作时能起作用,为什么由于用例而有差异?
根据VS2017 15.9.7和GCC-8.3.0,代码无法以相同的方式编译。STD = C 14均用于两者。vs:错误C3861:'begin':找不到标识符GCC:错误:在此范围中未声明"开始"
#include <array>
struct Struct {
int x;
};
int main()
{
{
std::array<int, 4> arr;
std::begin(arr);
begin(arr); // works, calls the same as std::begin above
}
{
std::pair<int, int> arr[4];
std::begin(arr);
begin(arr); // works, calls the same as std::begin above
}
{
int arr[4];
std::begin(arr);
begin(arr); // error
}
{
Struct arr[4];
std::begin(arr);
begin(arr); // error
}
}
我期望没有STD ::的开始,因为它在STD名称空间中声明,没有人说使用名称空间STD或使用开始。(或者如果有人这样做,就不会出错(
我在标记为"工作"的前两行中调试,我看到它跳入了同一std ::开始像一行一样开始实现。
标记"works"
的语句工作,因为传递给begin
的参数属于与begin
相同的名称空间。
在下面的示例中:
std::array<int, 4> arr;
begin(arr); // works, calls the same as std::begin above
参数arr
的类型属于命名空间std::
。begin
也属于命名空间std
。
要查找begin
编译器不仅要查看本地范围,还要查看包含参数类型的名称空间。这称为参数依赖性查找。当编译器查看std
名称空间时,它找到了begin
并能够称呼它。
当参数的类型为 std::pair
但是,在标记为"错误"的语句中,传递给begin
的参数的类型是C风格数组和Struct
。这两个都不属于std
名称空间。因此,编译器找不到begin
,因此无法调用。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 调用'begin(int [n])'没有匹配函数
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 为什么 free 函数不能在 C 数组上运行,而 std::begin 在某些情况下可以在 C++14 中运行?
- Arduino:Serial.begin() 与运行直流电机的代码冲突