这个警告:
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
with use of other libs; use /NODEFAULTLIB:library
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中是一个相当常见的警告.我想了解它的确切原因以及正确的方法(如果有的话)来处理它.
这出现在一个编译的调试版本中/MDd
.该项目与windows之类的东西相关联,Version.dll
并pdh.dll
与之相关MSVCRT.dll
.显然,我没有这些的调试版本,无法编译它们.
所以我添加/NODEFAULTLIB:MSVCRT
到链接器命令行,它实际上删除了警告.但这实际上做了什么?为什么有必要?
与传统的等待通知机制相比,使用Condition接口/实现的优势是什么?在这里,我引用Doug Lea撰写的评论:
条件因素将Object监视器方法(wait,notify和notifyAll)分解为不同的对象,以通过将它们与使用任意Lock实现相结合来实现每个对象具有多个等待集的效果.如果Lock替换了synchronized方法和语句的使用,则Condition将替换Object监视方法的使用.
我认为这是一种更加面向对象的实现等待/通知机制的方式.但是,前者是否有合理的优势?
我在Android NDK中使用C++设置日志记录.
我可以像这样打印一条消息给logcat:
__android_log_write(ANDROID_LOG_INFO, "tag here", "message here");
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个名为testint的整数.如何打印此int的值?
像这样的东西打印地址,但我想要的价值.我还没有在C++中找到有关如何执行此操作的任何内容.谢谢你的帮助!
__android_log_print(ANDROID_LOG_INFO, "sometag", "%p", *test);
Run Code Online (Sandbox Code Playgroud) 我已经使用了SFINAE习惯用了很多次,我习惯于把std::enable_if<>
模板参数放在模板参数而不是返回类型中.但是,我遇到了一些不起作用的琐碎案例,我不知道为什么.首先,这是我的主要内容:
int main()
{
foo(5);
foo(3.4);
}
Run Code Online (Sandbox Code Playgroud)
这是一个foo
触发错误的实现:
template<typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm an integer!\n";
}
template<typename T,
typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm a floating point number!\n";
}
Run Code Online (Sandbox Code Playgroud)
这是一个可以正常工作的等效代码:
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_integral<T>::value>::type
{
std::cout << "I'm an integrer!\n";
}
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_floating_point<T>::value>::type
{
std::cout << "I'm a floating point number!\n";
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么第一次执行 …
我刚刚对那些(相当)新功能进行了一些研究,我想知道为什么C++委员会决定为它们引入相同的语法?似乎开发人员不必浪费一些时间来理解它是如何工作的,并且一个解决方案让我们考虑进一步的问题.在我的情况下,它从问题开始,可以简化为:
#include <iostream>
template <typename T>
void f(T& a)
{
std::cout << "f(T& a) for lvalues\n";
}
template <typename T>
void f(T&& a)
{
std::cout << "f(T&& a) for rvalues\n";
}
int main()
{
int a;
f(a);
f(int());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我首先在VS2013上编译它,它按照我的预期工作,结果如下:
f(T& a) for lvalues
f(T&& a) for rvalues
Run Code Online (Sandbox Code Playgroud)
但有一个可疑的事情:intellisense强调了f(a).我做了一些研究,我明白这是因为类型崩溃(Scott Meyers将它命名为通用引用),所以我想知道g ++对它的看法.当然它没有编译.微软实现他们的编译器以更直观的方式工作是非常好的,但我不确定它是否符合标准,是否应该在IDE中存在这种差异(编译器与智能感知,但实际上可能存在在某种程度上是有道理的).好的,回到问题所在.我用这种方式解决了它:
template <typename T>
void f(T& a)
{
std::cout << "f(T& a) for lvalues\n";
}
template <typename T>
void f(const T&& a)
{
std::cout << "f(T&& a) for …
Run Code Online (Sandbox Code Playgroud) 我一直在阅读Scott关于c ++ 11和14的最后一篇大师文章中的通用引用,尽管有一个参数分配给左值或右值类型的参考参数,但在它们之间存在一些被称为通用引用的东西,它可以推导出来l/rvalue基于传递的参数的类型特征.我可以理解是什么使得参数成为通用引用但是我不清楚的一个原因是为什么在类型参数中添加const const T&& p
使得p为rvalue:
template<typename T>
void f(T&& param); // param is an universal reference
template<typename T>
void f(const T&& param); // param is an rvalue reference
Run Code Online (Sandbox Code Playgroud)
const
分配给参考参数时,是否会执行此操作.
如何构造一个std::array
索引序列,或一个依赖于顺序索引的lambda?
std::iota
并且std::generate
看起来很相关,但我不确定如何使用它们来构造一个std::array
,而不是将它们应用于已构造的一个(如果数组的元素类型不是默认构造的话,这是不可能的).
我要干的代码类型示例:
#include <array>
class C
{
public:
C(int x, float f) : m_x{x}, m_f{f} {}
private:
int m_x;
float m_f;
};
int main()
{
std::array<int, 10> ar = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::array<C, 3> ar2 = {C{0, 1.0}, C{1, 1.0}, C{2, 1.0}};
return 0;
}
Run Code Online (Sandbox Code Playgroud) 对于一般代码,我真的需要处理一个对象吗?我可以在大多数情况下忽略它,或者当你100%确定你不再需要它时总是丢弃一个物体是个好主意吗?
有没有办法找出android用来保存截图的路径?
我可以从代码中获取路径吗?
因为std::begin
,我们有两个容器重载:
template< class C >
auto begin( C& c ) -> decltype(c.begin());
template< class C >
auto begin( const C& c ) -> decltype(c.begin());
Run Code Online (Sandbox Code Playgroud)
但是常量C
模板推导规则可以推导出常数,所以看起来第二次重载是多余的.我错过了什么?