我今天跑了一个非常微妙的问题我希望得到你的意见.
考虑以下花园式共享体成语类:
struct S
{
S() : p_impl(new impl) {}
private:
struct impl;
boost::shared_ptr<impl> p_impl;
};
Run Code Online (Sandbox Code Playgroud)
当您尝试以下列方式将它们放入向量时,会出现这种乐趣:
std::vector<S> v(42);
Run Code Online (Sandbox Code Playgroud)
现在,至少使用MSVC 8,所有元素v共享同一个impl成员.实际上,导致这种情况的原因是vector构造函数:
template <typename T, typename A = ...>
class vector
{
vector(size_t n, const T& x = T(), const A& a = A());
...
};
Run Code Online (Sandbox Code Playgroud)
在这些场景中,只有一个S对象被默认构造,从中复制了它们的n元素vector.
现在,使用C++ 11,有rvalue引用.所以它不能像这样工作.如果a vector被构造为
std::vector<S> v(42);
Run Code Online (Sandbox Code Playgroud)
然后很可能,实现将选择默认构造n向量内的对象,因为复制构造可能不可用.在这种情况下,这将是一个突破性的变化.
我的问题是:
std::vector必须具有如上定义的构造函数,即.使用默认参数?特别是保证向量对象的条目被复制而不是默认构造?PS:请不要评论 …
问题是我是否可以安全地使用Visual Studio 2012来编辑项目属性,添加和删除解决方案,引用,以及与.NET 4.0 Framework相关的所有内容.
我记得在过去一些文件可能被"损坏",而Visual Studio 2010更改了一些Visual Studio 2008 csproj信息(xml文件).
如果在VS2012中添加/删除了某些标记,那么csproj将与VS2010开发人员不兼容.
如果在不损坏文件的情况下使用这个新IDE是安全的,有没有人有一些信息?VS2012 csprojs与VS2010"向后兼容"吗?
我有点困惑.
Oracle称Java 8与Java 7高度兼容(向后).但是,Java 8程序可以在Java 7上成功运行(SE/EE)的可能性有多大?
如果第一点是真的,Java 8应用程序将在Java 7服务器支持上部署和执行?例如,Tomcat 8还是WildFly?
Java版本之间是否存在不兼容性,其中针对Java版本X的Java源代码/ Java类文件将无法在版本Y(其中Y> X)下编译/运行?
"Java发布"我指的是以下版本:
家庭规则:
我重命名了一个python类,它是库的一部分.我愿意在一段时间内使用其以前的名称,但是我想警告用户它已被弃用,将来会被删除.
我认为,为了提供向后兼容性,使用类似的别名就足够了:
class NewClsName:
pass
OldClsName = NewClsName
Run Code Online (Sandbox Code Playgroud)
我不知道如何以OldClsName优雅的方式标记为已弃用.也许我可以创建OldClsName一个发出警告(记录)并NewClsName从其参数构造对象的函数(使用*args和**kvargs)但它看起来不够优雅(或者它可能是?).
但是,我不知道Python标准库弃用警告是如何工作的.我想可能有一些很好的魔法来处理弃用,例如允许根据某些解释器的命令行选项将其视为错误或静默.
问题是:如何警告用户使用过时的类别名(或一般的过时类).
编辑:函数方法对我不起作用(我已经试过了)因为类有一些类方法(工厂方法),当OldClsName定义为函数时无法调用.以下代码不起作用:
class NewClsName(object):
@classmethod
def CreateVariant1( cls, ... ):
pass
@classmethod
def CreateVariant2( cls, ... ):
pass
def OldClsName(*args, **kwargs):
warnings.warn("The 'OldClsName' class was renamed [...]",
DeprecationWarning )
return NewClsName(*args, **kwargs)
OldClsName.CreateVariant1( ... )
Run Code Online (Sandbox Code Playgroud)
因为:
AttributeError: 'function' object has no attribute 'CreateVariant1'
Run Code Online (Sandbox Code Playgroud)
继承是我唯一的选择吗?说实话,它对我来说看起来不太干净 - 它通过引入不必要的派生来影响类层次结构.此外,OldClsName is not NewClsName在大多数情况下,这不是问题,但如果使用该库的代码编写不当,可能会出现问题.
我还可以创建一个虚拟的,不相关的OldClsName类,并为其中的所有类方法实现构造函数和包装器,但在我看来,这是更糟糕的解决方案.
问候所有,
自从我第一次开始用C#编码以来,这让我很困惑.我的目标是创建一个程序集,该程序集将在用户拥有的最新.NET框架上运行,无论可能是什么.我不想要安装.NET 4,但是如果用户拥有它,我想使用它,更重要的是,如果用户只有 .NET 4而且下面没有任何内容,我希望它仍然有用.我开始怀疑这甚至不可能.
当我在Visual Studio中更改"目标框架"时,我真的不明白我在选择什么.这是否意味着"将与此版本兼容"?或者"只与这个版本兼容"?到目前为止似乎是后者; 我在虚拟机中的测试表明.NET 4目标程序集在没有.NET 4的情况下失败,而.NET 3.5目标程序集在没有.NET 3.5的情况下失败.有没有办法设置这个,所以我可以实现最大的兼容性?
更新:为了澄清,我有一个针对.NET 2的程序.这里的海报似乎表明它应该加载.NET 4.但是在只有.NET 4且之前没有任何东西的环境中,它无法加载.
UPDATE2:好的,想通了,但它比这里的海报似乎要复杂得多.我正在打开一个不同的问题来讨论错综复杂的问题,但简短的版本是,<supportedRuntime version="v4.0" />如果你想在.NET 4上运行非.NET 4程序集,你需要一个app.config .如果没有它,它们将无法加载.
使用Java compiler(javac)时,我们可以指定两种兼容性.一个是使用-source,另一个是使用-target.这两者有什么区别?
例如,-source 1.5和-target 1.6?
此外,是否有任何我们使用不同的源和目标兼容级别的情况?
我想将TortoiseSVN安装升级到1.7版.我们有一个运行SVN 1.6存储库的VisualSVN服务器.
在我更新客户端之前,是否需要将存储库升级到1.7,或者TortoiseSVN是否向后兼容?
我知道在从TortoiseSVN 1.6升级到1.7期间,我需要将我的工作副本转换为新格式,但在提交过程中是否有一些逻辑可以查看服务器版本并进行适当调整?
svn version-control tortoisesvn backwards-compatibility visualsvn-server
我们遇到的问题是Mootools在拖放功能方面没有特别向后兼容.我想知道是否有人有任何类似的问题与jQuery不向后兼容.我们开始大量使用它并且正在考虑升级到更新版本以开始使用需要它的几个插件.如果我们摆脱旧版本,我们会遇到任何问题吗?
javascript jquery mootools jquery-plugins backwards-compatibility
java ×3
.net ×1
assemblies ×1
bytecode ×1
c# ×1
c++ ×1
c++11 ×1
class ×1
compilation ×1
java-8 ×1
java-server ×1
javac ×1
javascript ×1
jquery ×1
jvm ×1
mootools ×1
python ×1
stl ×1
svn ×1
tortoisesvn ×1
vector ×1