Visual C ++不一致代码的示例?

时间:2011-01-30 22:12:29

标签: c++ visual-c++ standards-compliance

使用Visual C ++时,哪些代码不符合标准?允许在Visual C ++下编译但没有别的东西。

6 个答案:

答案 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关键字。大多数编译器都没有实现此功能,并且计划将其从下一版本的规范中删除。