如果 emplace_back 完全错误,为什么 QTCreator 不警告我?

Why doesn't QTCreator warn me if an emplace_back is completely wrong?

假设我有这个数字对向量:

std::vector<std::pair<ulong, ulong>> uniquePairs;

如果我这样做:

uniquePairs.emplace_back("literal garbage data");

它不冲我吼。难道不应该有人对我尖叫说这段代码是可怕的、完全错误的吗?根本没有来自 linter 的警告。

当然是去实际用GCC编译的时候失败了

If I do:

uniquePairs.emplace_back("literal garbage data");

It doesn't yell at me.

因为它不检查(执行)此类语句的正确性


那么真正的问题是 - 为什么不这样做?

答案是:因为这通常是 很多 的工作。让我们来看看这个案例:

uniquePairs.emplace_back("literal garbage data");

尝试调用 template< class... Args > reference emplace_back( Args&&... args ),其中 Args 是一个 参数包 ,由一种类型组成 - const char[21]。请记住,"c-string literals" 对文字的每个长度都有不同的类型。这是 问题 #1

问题 #1:

为您调用的所有类型实例化 emplace_backs。 的工作并不多,但之后可能会增加。

所述函数模板的成功实例化导致(根据函数的定义)完美转发,即问题#2.

问题 #2:

调用(实例化)std::forward。这只是在另一个范围内重复 问题 #1。不好,也不差。

问题 #3:

在我们已经实例化(在后台,没有完全编译意图)一些函数模板之后,我们现在需要检查 是否完美地转发了 emplace_back 的参数构造一个value_type你的std::vector.

你的 value_typestd::pair<ulong, ulong>。显然,const char[21] 不能那样做。你的 IDE 现在可以对着你尖叫了。


这是一个非常微不足道的案例,但请注意首先必须完成多少工作。现在假设您正在完美转发其他内容。更多的争论。更多的电话。更多后台实例化。

后台代码清理程序不应打扰您的工作。他们还应该(希望)以合理的时间方式为您提供可靠的提示。这个特性可能非常微不足道(你的情况)或非常复杂。简单的答案就是不要尝试完成此类任务。

奖金:

那为什么,如果你push_back("literal garbage data"),IDE通常会对你大吼大叫?

因为 push_back 的签名采用 const T&T&& 作为 std::vector<T>。很容易看出 const char[21] 不是 而不是 一个 std::pair<ulong, ulong> 可转换 为一个)。不需要实例化(前提是你的 vector 的实例化已经在后台完成。如果没有,请为这两种情况添加另一个问题)。工作不忙。易于计算,易于警告。