使用Visual C ++时,哪些代码不符合标准?允许在Visual C ++下编译但没有别的东西。
答案 0 :(得分:3)
您可以找到所有Microsoft语言扩展程序here;您可能还想查看VC ++不符合标准的areas of the language。
我认为是标准的(当我启用/Za开关时我注意到它)是“魔法l值演员”:
char *p;
(( int * ) p )++;
答案 1 :(得分:2)
某些版本的Visual C ++接受将非const引用传递给临时对象。这样的事情:
void DoSomething(std::string& str);
void NonConformantFunction()
{
DoSomething("Temporary std::string created here");
}
答案 2 :(得分:2)
“允许编译的东西 在Visual C ++下,但没有别的“
和
“不是标准的代码 符合“
不要描述完全相同的事情。编译器可以完全符合标准,同时具有该编译器特有的扩展,而不符合是标准明确禁止的。 ISO标准中还有许多“未定义”或“实现定义”部分可能会阻止可移植性而不会违反。此外,其他编译器支持许多受支持的扩展,因此是您的一个约束而不是另一个约束的示例。
现在说,VC ++的主要扩展会使其代码不可移植,它们都是C ++ / CLI扩展,因此也是需要它们的.NET Framework类库。 / p>
答案 3 :(得分:1)
有official page on microsoft.com说明VC ++与标准不兼容的部分是什么。但是,另一个问题是它与标准兼容默认。例如,for
变量的默认范围是still wrong in VC++2010。
答案 4 :(得分:1)
我没有VC编译器来测试它,但是如果我没记错的话,无论注释错误如何,这都可以在Visual Studio中正常编译:
template <typename T>
struct base {
void foo() {
T::type v = 0; // standard requires typename here
std::cout << v << std::endl;
}
};
template <typename T>
struct derived : base<T>
{
void bar() {
foo(); // foo() is not dependent this should not compile
}
};
struct test {
typedef int type;
};
int main() {
derived<test> o;
o.bar();
}
答案 5 :(得分:1)
MSVC ++允许您做的一件事是明确地专门化类中的模板。例如
class X {
public:
template <typename T> void doStuff(T value);
template <> void doStuff<bool>(bool value) {
// ..do something specific to bool.
}
};
这在VS中编译很好,但是尝试在GCC中编译会给出一个错误,告诉您在非命名空间范围内有明确的特化。解决方法是简单地拖出专业化。
class X {
public:
template <typename T> void doStuff(T value);
};
template <> void X::doStuff<bool>(bool value) {
// ..do something specific to bool.
}
根据规范,GCC在这个问题上是正确的,该规范声明所有显式特化都应该在命名空间范围内。
可能值得注意的是,在后一种情况下,您必须在头文件中定义您的专业化,而不是像您通常期望的那样定义实现文件。所提到的两个编译器都不符合解决此问题的标准,即在实现文件中的专门化上声明的export
关键字。大多数编译器都没有实现此功能,并且计划将其从下一版本的规范中删除。