【发布时间】:2013-10-20 17:37:44
【问题描述】:
下面代码中的std::move() 在Visual Studio 2013(带有调试配置)中编译时会发出运行时警告,因为它检测到dest 是nullptr。但是,源范围是空的,因此永远不应访问 dest。
C++ 标准可能不清楚这是否应该被允许?
它声明:要求:结果不得在 [first,last) 范围内。
nullptr 似乎可以满足该要求。
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec;
int* dest = nullptr;
// The range [begin(vec),end(vec)) is empty, so dest should never be accessed.
// However, it results in an assertion warning in VS2013.
std::move(std::begin(vec), std::end(vec), dest);
}
【问题讨论】:
-
@KerrekSB:不过,
begin并没有什么神奇之处。我可以创建自己的begin和end方法,它们都返回 null。这怎么会违反什么? -
@Mehrdad:不会,这完全没有意义——你只能有空容器。这就是为什么它是一个明智的警告。我猜这就像一个死代码或未使用的警告。
-
@KerrekSB:这里不是警告,而是断言 error。但无论如何,我不明白为什么它没有意义——考虑
std::array<int, 0>。我不知道标准是否实现了零大小的arrays,但如果实现了,我认为std::array::begin和std::array::end返回null 是完全合理,不是吗? (零大小的数组本身也是合理的——它可以用于小字符串优化,如果他不想优化,用户可以指定0。) -
@Mehrdad:我现在不确定:它说
begin() == end()必须是“唯一值”——是“每个对象唯一”还是“每个数组类型唯一”?在后一种情况下,空指针就可以了,而断言确实太多了。 -
@KerrekSB:我不知道,但我怀疑该措辞被准确指定为允许使用空指针。
标签: c++ visual-studio c++11