为什么C++中的以下内容是非法的?
auto x = unsigned int(0);
Run Code Online (Sandbox Code Playgroud)
以下都可以:
auto y = int(0);
auto z = unsigned(0);
auto w = float(0);
Run Code Online (Sandbox Code Playgroud)
或者一般来说:
auto t = Type(... c-tor-args ...);
Run Code Online (Sandbox Code Playgroud)
(除了Type存在unsigned int).
我有一个用GLSL编写的简单的OpenGL 3.3片段着色器.从本质上讲,我正在评估sin(x)适度大的x(10,000到2,000,000之间),如下所示:
#version 330
out vec4 fColor;
void main() {
fColor = vec4(sin(gl_FragCoord.x * gl_FragCoord.y));
}
Run Code Online (Sandbox Code Playgroud)
它在我的NVidia显卡上工作正常,但在我的Intel HD4000上,正弦仅返回四个不同的值(+/- 1.0和大约+/- 0.3),高于大约10,000的输入.
系统:Windows 64bit,(Intel)驱动程序版本15.28.20.64.3347.
我的问题:这是一个错误吗?或者供应商是否可以通过这种方式自由实施正弦?
考虑以下代码:
template<class F>
void foo1(F f) { f(); }
template<class F>
void foo2(F const& f) { f(); }
template<class F>
void foo3(F&& f) { f(); }
Run Code Online (Sandbox Code Playgroud)
foo我应该使用哪个版本?foo1这是我在"野外"看到的最多,但我担心它可能会引入我不想要的副本.我有一个很复杂的自定义仿函数,所以我想避免这种情况.目前我倾向于foo3(因为foo2不允许变异的算子),但我不确定其含义.
我的目标是C++ 11.
该CPP参考具有如何使用本示例std::enable_shared_from_this(略作调整)
class Good : std::enable_shared_from_this<Good>
{
public: std::shared_ptr<Good> getptr() { return shared_from_this(); }
};
...
auto good = std::make_shared<Good>();
good->getptr();
Run Code Online (Sandbox Code Playgroud)
但是,这在Visual Studio 2015(企业版14.0.25123.00更新2)中不起作用,即std::bad_weak_ptr引发异常。
查看其他示例(包括与cpp reference或Microsoft不同的示例),我注意到它们使用public继承而不是继承private。使用public继承实际上可以解决我的问题(std::bad_weak_ptr不再是有效的shared_ptr替代了)。
Cpp参考没有提到我必须公开继承std::enable_shared_from_this,所以错误在哪里?Visual Studio的行为是否错误(我猜想在使用private继承时存在可见性问题)还是cpp引用未提及此限制?
PS:make_shared<good>()或者shared_ptr<Good>(new Good)没有什么关系。
PSS:两种版本都可以正常编译,而专用版本则无法工作,这使其成为一种非常讨厌的错误。
编辑:更改struct为class。Cpp参考实际上在其示例中使用了公共继承。尽管如此,没有任何话说它必须是公开的。它实际上在那里列出,我只需要学习仔细阅读。谢谢@Angew。