如果 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_back
s。 的工作并不多,但之后可能会增加。
所述函数模板的成功实例化导致(根据函数的定义)完美转发,即问题#2.
问题 #2:
调用(实例化)std::forward
。这只是在另一个范围内重复 问题 #1。不好,也不差。
问题 #3:
在我们已经实例化(在后台,没有完全编译意图)一些函数模板之后,我们现在需要检查 是否完美地转发了 emplace_back
的参数构造一个value_type
你的std::vector
.
你的 value_type
是 std::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
的实例化已经在后台完成。如果没有,请为这两种情况添加另一个问题)。工作不忙。易于计算,易于警告。
假设我有这个数字对向量:
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_back
s。 的工作并不多,但之后可能会增加。
所述函数模板的成功实例化导致(根据函数的定义)完美转发,即问题#2.
问题 #2:
调用(实例化)std::forward
。这只是在另一个范围内重复 问题 #1。不好,也不差。
问题 #3:
在我们已经实例化(在后台,没有完全编译意图)一些函数模板之后,我们现在需要检查 是否完美地转发了 emplace_back
的参数构造一个value_type
你的std::vector
.
你的 value_type
是 std::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
的实例化已经在后台完成。如果没有,请为这两种情况添加另一个问题)。工作不忙。易于计算,易于警告。